fc2ブログ

| ブログトップ |     現在のページ ≫ 次のページ

[Code] 配列を利用して注文の変更を検出する

今度はORDERTYPE以外の注文内容が変更された状態について考えます。

■注文を持った状態 → 注文を持った状態(ORDERTYPE以外の注文内容が変更)
img2012010501.png

上の例では、STOPLOSSの値が1つ前の状態とで異なります。

1つ前の状態の同じチケットで、ORDERTYPE以外の注文内容が変更された場合について、具体的にプログラムしてみます。

[1]注文を持った状態:PreviousOrdersArray[1][5]
[2]注文を持った状態:CurrentOrdersArray[1][5]

-----------------------------------------------

int start()
{
int counted_bars=IndicatorCounted();
//----
static int lastCheckTime = 0;
//Print("lastCheckTime: ", lastCheckTime);

if(TimeCurrent()-lastCheckTime < CheckTimeInterval) return(0);
lastCheckTime = TimeCurrent();

double PreviousOrdersArray[1][5] = { 8015456, OP_BUY, 1.31785, 1.31085, 1.32785 };

double CurrentOrdersArray[1][5] = { 8015456, OP_BUY, 1.31785, 1.31700, 1.32785 };

int dim1_size_Previous = ArrayRange(PreviousOrdersArray,0);
Print("dim1_size_Previous: ", dim1_size_Previous);

for(int i= 0;i Print(PreviousOrdersArray[i][TICKET]," ",PreviousOrdersArray[i][ORDERTYPE]," ",PreviousOrdersArray[i][OPENPRICE]," ",PreviousOrdersArray[i][STOPLOSS]," ",PreviousOrdersArray[i][TAKEPROFIT]," ","\n");
}

int dim1_size_Current = ArrayRange(CurrentOrdersArray,0);
Print("dim1_size_Current: ", dim1_size_Current);

for(int j= 0;j Print(CurrentOrdersArray[j][TICKET]," ",CurrentOrdersArray[j][ORDERTYPE]," ",CurrentOrdersArray[j][OPENPRICE]," ",CurrentOrdersArray[j][STOPLOSS]," ",CurrentOrdersArray[j][TAKEPROFIT]," ","\n");
}

int Modified_Num;
int Modified = 0;
int FixProfit_Num;
int FixProfit = 0;

for(i= 0;i<dim1_size_Current;i++){//*2
for(j = 0;j<dim1_size_Previous;j++){//*3
if(CurrentOrdersArray[i][TICKET] == PreviousOrdersArray[j][TICKET]){//*4
if(CurrentOrdersArray[i][OPENPRICE] != PreviousOrdersArray[j][OPENPRICE] ||
CurrentOrdersArray[i][STOPLOSS] != PreviousOrdersArray[j][STOPLOSS] ||
CurrentOrdersArray[i][TAKEPROFIT] != PreviousOrdersArray[j][TAKEPROFIT]){//*5
Modified_Num = i;
Modified++;
//if(Modified > 0) Print("Modified: ",CurrentOrdersArray[i][TICKET]);

if((CurrentOrdersArray[i][ORDERTYPE] == OP_BUY &&
CurrentOrdersArray[i][STOPLOSS] > CurrentOrdersArray[i][OPENPRICE] &&
PreviousOrdersArray[j][STOPLOSS] <= CurrentOrdersArray[i][OPENPRICE] )||
(CurrentOrdersArray[i][ORDERTYPE] == OP_SELL &&
CurrentOrdersArray[i][STOPLOSS] < CurrentOrdersArray[i][OPENPRICE] &&
PreviousOrdersArray[j][STOPLOSS] >= CurrentOrdersArray[i][OPENPRICE] )){//*6
FixProfit_Num = i;
FixProfit++;
}//*6
}//*5
break;
}//*4
}//*3
}//*2

if(Modified > 0) Print("CurrentOrdersArray[Modified_Num][TICKET]: ", CurrentOrdersArray[Modified_Num][TICKET]);
else Print("Nothing: Modified");
if(FixProfit > 0) Print("CurrentOrdersArray[FixProfit_Num][TICKET]: ", CurrentOrdersArray[FixProfit_Num][TICKET]);
else Print("Nothing: FixProfit");

//----
return(0);
}
スポンサーサイト



| ブログトップ |     現在のページ ≫ 次のページ

[Code] 配列を利用して指値逆指値キャンセルを検出する

今度は指値逆指値のキャンセルがあった状態について考えます。

1つ前の状態が指値逆指値の注文を持っていた場合については次の2つのパターンが考えられます。

(1)指値逆指値の注文を持った状態 → 注文のない状態
img2012010202.png

(2)指値逆指値の注文を持った状態 → 指値逆指値の注文を持った状態(状態の変化なし)
img2012010203.png

指値逆指値のキャンセルがあった場合は(1)です。これを言葉で説明すると

(1)1つ前の状態で指値逆指値の注文を持ち、現在の状態ではその同じチケットは存在しない場合


具体的にプログラムしてみます。

[1]指値逆指値の注文を持った状態:PreviousOrdersArray[1][5]
[2]注文のない状態:CurrentOrdersArray[1][5]

-----------------------------------------------
int start()
{
//----
static int lastCheckTime = 0;
//Print("lastCheckTime: ", lastCheckTime);

if(TimeCurrent()-lastCheckTime < CheckTimeInterval) return(0);
lastCheckTime = TimeCurrent();

double PreviousOrdersArray[1][5] = { 8015456, OP_BUYLIMIT, 1.31785, 1.31085, 1.32785};

double CurrentOrdersArray[1][5] = {};

int dim1_size_Previous = ArrayRange(PreviousOrdersArray,0);
Print("dim1_size_Previous: ", dim1_size_Previous);

for(int i= 0;i<dim1_size_Previous;i++){
Print(PreviousOrdersArray[i][TICKET]," ",PreviousOrdersArray[i][ORDERTYPE]," ",PreviousOrdersArray[i][OPENPRICE]," ",PreviousOrdersArray[i][STOPLOSS]," ",PreviousOrdersArray[i][TAKEPROFIT]," ","\n");
}

int dim1_size_Current = ArrayRange(CurrentOrdersArray,0);
Print("dim1_size_Current: ", dim1_size_Current);

for(int j= 0;j<dim1_size_Current;j++){
Print(CurrentOrdersArray[j][TICKET]," ",CurrentOrdersArray[j][ORDERTYPE]," ",CurrentOrdersArray[j][OPENPRICE]," ",CurrentOrdersArray[j][STOPLOSS]," ",CurrentOrdersArray[j][TAKEPROFIT]," ","\n");
}

int exist_PreviousTICKET = 0;
int same_CurrentTICKET = 0;
int PO_Closed_Num;
int PO_Closed = 0;

for(i= 0;i<dim1_size_Previous;i++){
if(PreviousOrdersArray[i][ORDERTYPE] == OP_BUY || PreviousOrdersArray[i][ORDERTYPE] == OP_SELL) continue;
exist_PreviousTICKET = 1;
PO_Closed_Num = i;
for(j = 0;j<dim1_size_Current;j++){
if(PreviousOrdersArray[i][TICKET] == CurrentOrdersArray[j][TICKET]){
same_CurrentTICKET = 1;
break;
}
}
}

if(exist_PreviousTICKET==1 && same_CurrentTICKET==0) PO_Closed++;

if(PO_Closed > 0) Print("PreviousOrdersArray[PO_Closed_Num][TICKET]: ", PreviousOrdersArray[PO_Closed_Num][TICKET]);
else Print("Nothing");

//----
return(0);
}

| ブログトップ |     現在のページ ≫ 次のページ

[Code] 配列を利用して新規指値逆指値注文を検出する

今度は新規指値逆指値の注文があった状態について考えます。

現在の状態が指値逆指値の注文を持っていた場合については次の2つのパターンが考えられます。

(1)注文のない状態 → 指値逆指値の注文を持った状態
img2012010201.png

(2)指値逆指値の注文を持った状態 → 指値逆指値の注文を持った状態(状態の変化なし)
img2012010203.png

新規の指値逆指値の注文があった場合は(1)です。これを言葉で説明すると

(1)現在指値逆指値の注文を持った状態で一つ前の状態には同じチケットが存在しない場合


具体的にプログラムしてみます。

[1]注文のない状態:PreviousOrdersArray[1][5]
[2]指値逆指値の注文を持った状態:CurrentOrdersArray[1][5]

-----------------------------------------------

int start()
{
//----
static int lastCheckTime = 0;
//Print("lastCheckTime: ", lastCheckTime);

if(TimeCurrent()-lastCheckTime < CheckTimeInterval) return(0);
lastCheckTime = TimeCurrent();

double PreviousOrdersArray[1][5] = {};

double CurrentOrdersArray[1][5] = { 8015456, OP_BUYLIMIT, 1.31785, 1.31085, 1.32785};

int dim1_size_Previous = ArrayRange(PreviousOrdersArray,0);
Print("dim1_size_Previous: ", dim1_size_Previous);

for(int i= 0;<dim1_size_Previous;i++){
Print(PreviousOrdersArray[i][TICKET]," ",PreviousOrdersArray[i][ORDERTYPE]," ",PreviousOrdersArray[i][OPENPRICE]," ",PreviousOrdersArray[i][STOPLOSS]," ",PreviousOrdersArray[i][TAKEPROFIT]," ","\n");
}

int dim1_size_Current = ArrayRange(CurrentOrdersArray,0);
Print("dim1_size_Current: ", dim1_size_Current);

for(int j= 0;j<dim1_size_Current;j++){
Print(CurrentOrdersArray[j][TICKET]," ",CurrentOrdersArray[j][ORDERTYPE]," ",CurrentOrdersArray[j][OPENPRICE]," ",CurrentOrdersArray[j][STOPLOSS]," ",CurrentOrdersArray[j][TAKEPROFIT]," ","\n");
}

int exist_CurrentTICKET = 0;
int same_PreviousTICKET = 0;
int PO_Opend_Num;
int PO_Opend = 0;

for(i= 0;i<dim1_size_Current;i++){
if(CurrentOrdersArray[i][ORDERTYPE] == OP_BUY || CurrentOrdersArray[i][ORDERTYPE] == OP_SELL) continue;
exist_CurrentTICKET = 1;
PO_Opend_Num = i;
for(j = 0;j<dim1_size_Previous;j++){
if(CurrentOrdersArray[i][TICKET] == PreviousOrdersArray[j][TICKET]){
same_PreviousTICKET = 1;
break;
}
}
}

if(exist_CurrentTICKET==1 && same_PreviousTICKET==0) PO_Opend++;

if(PO_Opend > 0) Print("CurrentOrdersArray[PO_Opend_Num][TICKET]: ", CurrentOrdersArray[PO_Opend_Num][TICKET]);
else Print("Nothing");

//----
return(0);
}

| ブログトップ |     現在のページ ≫ 次のページ

[Code] 配列を利用してクローズポジションを検出する

今度はポジションがクローズされた状態について考えます。

1つ前の状態がポジションを持っていた場合については次の2つのパターンが考えられます。

(1)ポジションを持った状態 → 注文のない状態
img2011122604.png

(2)ポジションを持った状態 → ポジションを持った状態(状態の変化なし)
img2011122603.png

ポジションがクローズされた状態は(1)です。これを言葉で説明すると

(1)1つ前の状態でポジションを持っていたチケットが現在の状態にない場合


具体的にプログラムしてみます。

img2011121904.png

この表を配列で表します。

[1]ポジションを持った状態:PreviousOrdersArray[3][5]
[2]ポジションがクローズされた状態:CurrentOrdersArray[2][5]

-----------------------------------------------

static int lastCheckTime = 0;
//Print("lastCheckTime: ", lastCheckTime);

if(TimeCurrent()-lastCheckTime < CheckTimeInterval) return(0);
lastCheckTime = TimeCurrent();

double PreviousOrdersArray[3][5] = { 8015456, OP_BUY, 1.31785, 1.31085, 1.32785,
8015483, OP_BUYSTOP, 1.3246, 1.3156, 1.3346,
8015510, OP_SELLSTOP, 1.31438, 132338, 1.30438 };

double CurrentOrdersArray[2][5] = { 8015483, OP_BUYSTOP, 1.3246, 1.3156, 1.3346,
8015510, OP_SELLSTOP, 1.31438, 1.32338, 1.30438 };

int dim1_size_Previous = ArrayRange(PreviousOrdersArray,0);
Print("dim1_size_Previous: ", dim1_size_Previous);

for(int i= 0;i<dim1_size_Previous;i++){
Print(PreviousOrdersArray[i][TICKET]," ",PreviousOrdersArray[i][ORDERTYPE]," ",PreviousOrdersArray[i][OPENPRICE]," ",PreviousOrdersArray[i][STOPLOSS]," ",PreviousOrdersArray[i][TAKEPROFIT]," ","\n");
}

int dim1_size_Current = ArrayRange(CurrentOrdersArray,0);
Print("dim1_size_Current: ", dim1_size_Current);

for(int j= 0;j<dim1_size_Current;j++){
Print(CurrentOrdersArray[j][TICKET]," ",CurrentOrdersArray[j][ORDERTYPE]," ",CurrentOrdersArray[j][OPENPRICE]," ",CurrentOrdersArray[j][STOPLOSS]," ",CurrentOrdersArray[j][TAKEPROFIT]," ","\n");
}

int exist_TICKET = 0;
int same_TICKET = 0;
int Closed_Num;
int Closed = 0;

for(i= 0;i<dim1_size_Previous;i++){
if(PreviousOrdersArray[i][ORDERTYPE] != OP_BUY && PreviousOrdersArray[i][ORDERTYPE] != OP_SELL) continue;//[1]のPreviousOrdersArrayからポジションを持った状態の「チケット」を探します。
exist_TICKET = 1;
Closed_Num = i;
for(j = 0;j<dim1_size_Current;j++){
if(PreviousOrdersArray[i][TICKET] == CurrentOrdersArray[j][TICKET]){
same_TICKET = 1;//「チケット」が同じ場合は検出から除外します。
break;
}
}
}

if(exist_TICKET==1 && same_TICKET==0) Closed++;//1つ前の状態がポジションを持っていて、現在はその同じ「チケット」が存在しない場合、ポジションがクローズされたとしてフラッグをたてる

if(Closed > 0) Print("PreviousOrdersArray[Closed_Num][TICKET]: ", PreviousOrdersArray[Closed_Num][TICKET]);
else Print("Nothing");

| ブログトップ |     現在のページ ≫ 次のページ

[Code] 配列を利用して新規ポジションを検出する

ポジションを持った状態について考えます。

現在ポジションを持った状態とその1つ前の状態は次の3つのパターンが考えられます。

(1)注文のない状態 → ポジションを持った状態
img2011122601.png

(2)待機注文の状態 → ポジションを持った状態
img2011122602.png

(3)ポジションを持った状態 → ポジションを持った状態(状態の変化なし)
img2011122603.png

それでは、新規ポジションを持った状態というのは上の(1)と(2)です。これを言葉で説明すると

(1)現在ポジションを持った状態の一つ前の状態に同じチケットと同じオーダータイプが存在しない場合。

(2)現在ポジションを持った状態の一つ前の状態と同じチケットでもオーダータイプが異なる場合。


具体的にプログラムしてみます。

配列に格納したデータから新規ポジションを持った場合に検出する方法を考えます。新規ポジションを持った場合を次の表で表しました。この表は前回の説明で使った同じものです。

img2011121901.png

この表を配列で表します。

[1]待機注文の状態:PreviousOrdersArray[4][5]
[2]ポジションを持った状態:CurrentOrdersArray[3][5]

この配列に上記のデータを格納します。

double PreviousOrdersArray[4][5] = { 8015456, OP_BUYLIMIT, 1.31785, 1.31085, 1.32785,
8015459, OP_SELLLIMIT, 1.32166, 1.32866, 1.31166,
8015483, OP_BUYSTOP, 1.3246, 1.3156, 1.3346,
8015510, OP_SELLSTOP, 1.31438, 1.32338, 1.30438 };

double CurrentOrdersArray[3][5] = { 8015456, OP_BUY, 1.31785, 1.31085, 1.32785,
8015483, OP_BUYSTOP, 1.3246, 1.3156, 1.3346,
8015510, OP_SELLSTOP, 1.31438, 132338, 1.30438 };

-----------------------------------------------

//プログラムの先頭に次の記述をします。

#define TICKET 0
#define ORDERTYPE 1
#define OPENPRICE 2
#define STOPLOSS 3
#define TAKEPROFIT 4

int CheckTimeInterval = 5;//注文内容を確認するための時間の間隔。

-----------------------------------------------

static int lastCheckTime = 0;
//Print("lastCheckTime: ", lastCheckTime);

if(TimeCurrent()-lastCheckTime < CheckTimeInterval) return(0);
lastCheckTime = TimeCurrent();

double PreviousOrdersArray[4][5] = { 8015456, OP_BUYLIMIT, 1.31785, 1.31085, 1.32785,
8015459, OP_SELLLIMIT, 1.32166, 1.32866, 1.31166,
8015483, OP_BUYSTOP, 1.3246, 1.3156, 1.3346,
8015510, OP_SELLSTOP, 1.31438, 1.32338, 1.30438 };

double CurrentOrdersArray[3][5] = { 8015456, OP_BUY, 1.31785, 1.31085, 1.32785,
8015483, OP_BUYSTOP, 1.3246, 1.3156, 1.3346,
8015510, OP_SELLSTOP, 1.31438, 132338, 1.30438 };

int dim1_size_Previous = ArrayRange(PreviousOrdersArray,0);
Print("dim1_size_Previous: ", dim1_size_Previous);//[1]待機注文の状態のオーダー数をプリントアウト

for(int i= 0;i<dim1_size_Previous;i++){
Print(PreviousOrdersArray[i][TICKET]," ",PreviousOrdersArray[i][ORDERTYPE]," ",PreviousOrdersArray[i][OPENPRICE]," ",PreviousOrdersArray[i][STOPLOSS]," ",PreviousOrdersArray[i][TAKEPROFIT]," ","\n");//[1]配列に格納したデータをプリントアウト
}

int dim1_size_Current = ArrayRange(CurrentOrdersArray,0);
Print("dim1_size_Current: ", dim1_size_Current);//[2]ポジションを持った状態のオーダー数

for(int j= 0;j<dim1_size_Current;j++){
Print(CurrentOrdersArray[j][TICKET]," ",CurrentOrdersArray[j][ORDERTYPE]," ",CurrentOrdersArray[j][OPENPRICE]," ",CurrentOrdersArray[j][STOPLOSS]," ",CurrentOrdersArray[j][TAKEPROFIT]," ","\n");//[2]配列に格納したデータをプリントアウト
}

img2011121902.png

int exist_TICKET = 0;
int same_TICKET_and_ORDERTYPE = 0;
int Opend_Num;//新規ポジションをもつオーダー番号
int Opend = 0;//新規ポジションを持った場合のフラッグ

for(i= 0;i<dim1_size_Current;i++){
if(CurrentOrdersArray[i][ORDERTYPE] != OP_BUY && CurrentOrdersArray[i][ORDERTYPE] != OP_SELL) continue;//[2]のCurrentOrdersArrayからポジションを持った状態の「チケット」を探します。
exist_TICKET = 1;
Opend_Num = i;
for(j = 0;j<dim1_size_Previous;j++){
if((CurrentOrdersArray[i][TICKET] == PreviousOrdersArray[j][TICKET]) && (CurrentOrdersArray[i][ORDERTYPE] != PreviousOrdersArray[j][ORDERTYPE])){//「チケット」が同じでも「オーダータイプ」が違う場合は新規ポジションとして検出します。
break;
}
else if((CurrentOrdersArray[i][TICKET] == PreviousOrdersArray[j][TICKET]) && (CurrentOrdersArray[i][ORDERTYPE] == PreviousOrdersArray[j][ORDERTYPE])){
same_TICKET_and_ORDERTYPE = 1;//「チケット」と「オーダータイプ」が同じ場合は検出から除外します。
break;
}
}
}

if(exist_TICKET==1 && same_TICKET_and_ORDERTYPE==0) Opend++;//現在ポジションを持っており、そのポジションは前の状態の「チケット」と「オーダータイプ」が同じでない場合は新規ポジションとしてフラッグをたてる
if(Opend > 0) Print("CurrentOrdersArray[Opend_Num][TICKET]: ", CurrentOrdersArray[Opend_Num][TICKET]);
else Print("Nothing");

img2011121903.png

profile

atslab

Author:atslab
ATSLABへようこそ!FXトレードに関する情報を発信しています。
著者はプログラマー、FXトレーダーです。情報環境学という大学の研究機関で研究員を経て独立。FXは裁量トレード、システムトレード、コンピュータによる自動売買をそれぞれ併用して取り引きしています。これまで取引ツールをいくつもプログラミングしてきました。その中から取引に有効なツールを提供していきたいと考えています。

entry
comment
trackback
archive
category
form
rss
link
qrcode
QR
copyright
Author by atslab

Designed by マンゴスチンw

ATSLAB(FX初心者が読んで面白い!外国為替の自動売買システム研究所)