MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 248

 
STARIJ:

インターネット再開郵便局に手紙を出すことはできますか?


はい、連絡を取っています。メールしてください。

 

アドバイザーを磨くのに役立つ 私は初心者プログラマーです、説明。

このアドバイザーは2つの通貨ペアEURUSDとUSDCHFで動作し、10ppダイバージェンス(基本的に標準的なアービトレーター)があるときだけ2つの買い取引を開きます。

以下は、if ((ind2>ind1+impulse*Point && ind3<ind4-impulse*Point) || (ind2<ind1-impulse*Point && ind3>ind4+impulse*Point)) という条件である。

そして、損益の合計がある値に達すると閉じます。if ((AccountProfit()>=10)||(AccountProfit()<=-20)))


問題点:常に2つの取引を開くとは限らず、3つの取引を開くこともある。または、同じ通貨の取引を2つ開く。必要なもの:常に異なる通貨で2つの取引を開く(1つ - EURUSDで、もう1つ - USDCHFで)。



以下は、コードそのものです。


extern double impulse = 10; //グローバル変数

extern double Lots = 1;


int start()

{

double ind2=iClose("EURUSD",PERIOD_M1,0)。

double ind1=iOpen("EURUSD",PERIOD_M1,0)。


double ind3=iClose("USDCHF",PERIOD_M1,0)。

double ind4=iOpen("USDCHF",PERIOD_M1,0)。


double oper1=ind2-ind1;

double EUR=(int)DoubleToStr(oper1*100000,0);


double oper2=ind3-ind4。

double CHF=(int)DoubleToStr(oper2*100000,0);


Comment(StringFormat("Output datanEUR = %GnCHF =%G",EUR,CHF));

if ((AccountProfit()>=10)||(AccountProfit()<=-20)))// 閉会条件

Alert3()です。

if ((ind2>ind1+impulse*Point && ind3<ind4-impulse*Point) || (ind2<ind1-impulse*Point && ind3>ind4+impulse*Point))//オープンコンディション

if (OrdersTotal() == 0)

Alert1()です。

if (OrdersTotal() == 1)

Alert2()です。

return(0)です。

}


int Alert1()

{

if (OrdersTotal() == 0)

int send1=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,0,0)を実行。

return(0)です。

}


int Alert2()

{

if(OrdersTotal() == 1)

int send2=OrderSend("USDCHF",OP_BUY,Lots,Ask,3,0,0)とする。

return(0)です。

}


int Alert3()

{

while (注文合計()>0)

if (OrderSelect(0, SELECT_BY_POS, MODE_TRADES))//閉じる

int cl1=OrderClose (OrderTicket(),OrderLots(),Bid,3);

int cl1=OrderClose (OrderTicket(),OrderLots(),Ask,3);

return(0)です。

}

 

Alexey Belyakov:  CУТЬ ПРОБЛЕММЫ: Не всегда открывает 2 сделки, а бывает открывает 3. Или открывает две сделки по одной валюте. Нужно чтобы: открывал всегда 2 сделки по разным валютам ( одна - по EURUSD; другая- по USDCHF)

サーバーにユーロの開放を命令する。それがサーバーに届くまでに、サーバーが ...今のところ、注文はない。次のティックで再び条件が満たされ、再びユーロのオープンの注文が出されます。サーバーが最初の注文を開きました。注文が1件なので、2件目(すでに3件目!)の注文を開けるコマンドを送信する。

全ての機能を無効とし、リターンを削除しました。以下は、プログラムのこの部分です(ボタンSRCを押して挿入しました)。

  if((ind2>ind1+impulse*Point && ind3<ind4-impulse*Point) ||
     (ind2<ind1-impulse*Point && ind3>ind4+impulse*Point))   // Условие открытия
     if(OrdersTotal() == 0) Alert1();
     if(OrdersTotal() == 1) Alert2();
}

void Alert1()
{
  if (OrdersTotal() == 0)  // Перед вызовом этой функции уже проверялось количество ордеров
  int send1=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,0,0);
}

void Alert2()
{
  if(OrdersTotal() == 1)  // Перед вызовом этой функции уже проверялось количество ордеров
  int send2=OrderSend("USDCHF",OP_BUY,Lots,Ask,3,0,0);
}

に交換し、(少し粗いですが、IMHOはオリジナルより良い)。

  if((ind2>ind1+impulse*Point && ind3<ind4-impulse*Point) ||
     (ind2<ind1-impulse*Point && ind3>ind4+impulse*Point))   // Условие открытия
     if(OrdersTotal() == 0)
  {
    int send1=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,0,0); 
    int send2=OrderSend("USDCHF",OP_BUY,Lots,Ask,3,0,0);
    Sleep(60); // Дождаться следующего бара, а то еще пооткрывает
  }
}

Alert3 関数に 余分な行があります。

  int cl1=OrderClose (OrderTicket(),OrderLots(),Ask,3);
double CHF=(int)DoubleToStr(oper2*100000,0); の代わりに int CHF=oper2/_Point を試してみてください。
 
STARIJ:

に交換した(粗雑だが、IMHOではオリジナルより良い)。

失礼にあたらないが、エラーで動作するようになる。どちらの注文も同じキャラクターのAskで行くからというだけなら。
 
Alexey Kozitsyn:   失礼にあたらないが、エラーで動作するようになる。両方の注文が同じシンボルのAskで行くからというだけなら。

もちろん、まったくそのとおりです。しかも、この間違いはソースコードの中にあったのですが、作者とあなた、そして罪人である私の両方の関数を使って偽装していたのです。機能を削除した後、エラーは明らかになった。EAが設置されているチャートのシンボルでのみポジションが開かれると思うのですが。そうだろ?

 
STARIJ:

もちろん、まったくそのとおりです。そして、この間違いはソースコードの中に含まれていたのですが、作者から、あなたから、そして罪深い私から、関数を使うことで覆い隠していたのです。機能を削除した後、エラーは明らかになった。EAが設置されているチャートのシンボルでのみポジションが開かれると思うのですが。そうだろ?

もちろん、開設の条件が整っていればの話ですが。第2シンボルのAskは別途取得する必要があります。
 
皆さん、こんにちは。質問は単純で、OrdersTotal()関数に関する ものです。注文数を返すもので、注文には0からNまでの番号が振られていることがわかる。しかし、履歴の中で新しく開いたバーから順に番号が付けられている場合、つまり「新しい」バーには0番、「古い」バーにはN番が付けられることになります。そして、OrdersTotal()関数では、すべてが逆に行われると理解しています。最も古いオープンオーダーには0番、「新鮮な」オーダーにはN番が振られます。うまくいったかな?
 
Youri Lazurenko:
皆さん、こんにちは。質問は単純で、OrdersTotal()関数に関する ものです。注文数を返し、注文番号が0からNになることは明らかです。しかし、もしバーが履歴の中で新しく開かれたものから順に番号付けされているとしたら、つまり「新しい」バーには0、古いバーにはNの番号が付けられることになります。そして、OrdersTotal()関数では、すべてが逆に行われると理解しています。最も古いオープンオーダーには0番、「新鮮な」オーダーにはN番が振られます。うまくいったかな?

かなり、ニュアンスが違いますね。

仕分けが端末の仕分けに依存していた時代もあった。仕分けがまた端末の仕分けに依存するようになると、その時間が「突然」戻ってくるかどうかは、ユーザーにはわからないのです。そのため、注文を配列に集め、オープン/クローズ時間でソートする方がより確実です。そうすれば、ソートが時間に依存し、ターミナルでのソートに「突然」依存しないことを確実に知ることができるからです。

 
Artyom Trishkin:

かなり、ニュアンスが違いますね。

仕分けが端末の仕分けに依存していた時代もあった。仕分けがまた端末の仕分けに依存するようになると、その時間が「突然」戻ってくるかどうかは、ユーザーにはわからないのです。そのため、注文を配列に集め、オープン/クローズ時間でソートするのがよいでしょう。そうすれば、ソートが時間に依存し、ターミナルでのソートに「突然」依存しないことを確実に知ることができます。


こんにちは。ご返信ありがとうございました。まず、前回の私の質問に対する回答、「逆サイクル」の話に戻りたい。昨日、出勤前に、返信を書いたのですが、今日になって、自分の(あなたの)書き込みが全く見つからなくなりました。私が理解した限りでは、間違った枝で質問してしまったようです。逆のサイクルはi--?

"だから、注文を配列に集めて、開閉 時間でソートした方が信頼性が高い" - これは非常に興味深いし、その方が信頼性が高く正しいと思う(最後の注文を定義すると、必ずしも必要なものが得られるとは限らないようだ)。難しくないのであれば、どのようにすればよいのでしょうか(オープンタイムで配列を作成する)。

そしてもうひとつ。まだ試していません。利益が出ている注文と負けている(ロックしている)注文があります。利食い注文はトレーリングストップで決済されます。決済した注文を記録して、その合計利益と損切りした注文を比較し、プラス残高があれば損切りした注文を決済する方法。どのような注文が締め切られたのか、具体的に知りたい。

 
STARIJ:

EAが設置されているチャートのシンボルでのみポジションが開くと思います。そうだろ?

エキスパートアドバイザーがEURUSDで動作しているが、USDCHFに買い注文を出したい場合。

の場合、OrderSend の Ask の代わりに MarketInfo("USDCHF",MODE_ASK); を使用する必要があります(これは EURUSD 用になります)。