初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 143

 
Лауреат:
ローソク足が指定回数経過すると、ブリッジでオープンポジションを クローズする関数の作り方。
int numBars = 5;
void OnTick()
{
     for(int i = OrdersTotal(); i >= 0; i--)
     {
          if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
          if( OrderSymbol() != _Symbol)                continue;
          if( OrderMagicNumber() != Magic)             continue;
          if( OrderOpenTime() > Time[numBars-1] )      continue; 
          
          /* work */
     }
}
 
sviter-pro:
実験中です!!!logic is specific!!! Can you help me?

具体的にはどのようなことですか?

最後のポジションを見て、反対側のポジションを開く。

 
Konstantin Nikitin:

調べてみます。

 
sviter-pro:

ちゃんと確認しますよ。

 

こんにちは。機能面でご協力をお願いします。1つのアカウントで、複数のEAが取引されているはずです。各EAは1日に1回までしか取引を行うことができません。EAがすでに取引をした場合はtrue を、取引がない場合はfalse を返すような関数が必要です。チェックは、私の理解では、現在の日付でマジックで 行われるはずです。このようなチェックが必要な各EAにこの機能を組み込む予定ですので、ご協力お願いします。もしお役に立てるのであれば、このようなチェックが必要なEAにそれぞれ組み込む予定です。

 
Kolya32:

こんにちは。機能面でご協力をお願いします。1つのアカウントで、複数のEAと取引することを想定しています。各EAは1日に1回までしか取引を行うことができません。取引があった場合はtrue を、取引がなかった場合はfalse を返す関数が必要です。チェックは、私の理解では、現在の日付でマジックで 行われるはずです。このようなチェックが必要な各EAにこの機能を組み込む予定ですので、ご協力お願いします。もしお役に立てるのであれば、このようなチェックが必要なEAにそれぞれ組み込む予定です。

すべてはすでに私たちの前に行われている ))こちらをご覧ください

 

isTradeToDay()関数が必要なようです。まあ、実験してみます)ありがとうございました。

int mn=-1をコメントアウトし、mnをMagicに置き換えることで、自分用に関数を修正しました。この機能を使ったEAをテスターで動かしたところ、EAのテスト 時間が何年もかかってしまうという大きな欠点が判明しました。そこで、この機能を搭載したExpert Advisorをデモ口座でテストしてみることにしました。Expert Advisorを5つ入れているのですが、取引開始のタイムラグが気になります...。

bool isTradeToDay(string sy="", int op=-1 /*,int mn=-1*/) { { {.
int i, k=OrdersHistoryTotal();

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {.
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
if (OrderSymbol()==sy || sy=="") {.
if (OrderType()==OP_BUY || OrderType()==OP_SELL) { (オーダータイプ()==OP_BUY)
if (op<0 || OrderType()==op) { }.
if (Magic<0 || OrderMagicNumber()==Magic) { (Magic<0 || OrderMagicNumber()==Magic))
if (TimeDay(OrderOpenTime())==Day()の場合)
&& TimeMonth(OrderOpenTime())==Month()です。
&& TimeYear(OrderOpenTime())==Year()) return(True);
}
}
}
}
}
}
k=OrdersTotal()。
for (i=0; i<k; i++) {.
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
if (OrderSymbol()==sy || sy=="") {.
if (OrderType()==OP_BUY || OrderType()==OP_SELL) { (オーダータイプ()==OP_BUY)
if (op<0 || OrderType()==op) { }.
if (Magic<0 || OrderMagicNumber()==Magic) { (Magic<0 || OrderMagicNumber()==Magic))
if (TimeDay(OrderOpenTime())==Day()の場合)
&& TimeMonth(OrderOpenTime())==Month()です。
&& TimeYear(OrderOpenTime())==Year()) return(True);
}
}
}
}
}
}
return(False)です。
}

 

チャート上にグリッドのブレークイーブンレベルをマークする必要があります。

利益をpipsで表示します。

double current_Prof_Pts = current_Prof_Bux/current_summ_lot/(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE)/(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)/_Point)

BUYグリッドのブレークイーブン位置

zero = Bid-current_Prof_Pts*_Point

(売りの場合、それぞれ Ask+current_Prof_Pts*_Point)

結果:正しいように見えるが、常に3ポイントほど真の値の周りでジャンプしている。

エラーの発生箇所を教えてください。

 
Kolya32:

isTradeToDay()関数が必要なようです。まあ、実験してみますが)ありがとうございました。

EAのテストに かかる時間が5倍になったのです。

はい、もちろんです。関数は普遍的な書き方をしています。チックごとにアクセスすると、ループがアカウント履歴全体を通過することになります。また、アカウントの履歴はかなり深い場合があります(100 000以上の注文があるケースを見たことがあります)。実行速度を上げるために、毎回、履歴全体に対してループを実行する必要はありません。最初に一度だけ行い、最後に処理したオーダーのインデックスを覚えておけば十分です。次に、保存されたインデックスより大きいインデックスを持つ注文に対してのみ、ループを通過させる必要があります。その後、再び最後の命令のインデックスを記憶する、というように。

 
Igor Zakharov:

チャート上にグリッドのブレークイーブンレベルをマークする必要があります。

利益をpipsで表示します。

BUYグリッドのブレークイーブン位置

(売りの場合、それぞれ Ask+current_Prof_Pts*_Point)

結果:正しいように見えるが、常に3ポイントほど真の値の周りでジャンプしている。

どこにエラーがあるのか、アドバイスをお願いします。

浮いたスプレッドの せいである。