EAに必要な簡単なコード(2つのオープンオーダーの修正) - ページ 2 12345 新しいコメント Tjipke de Vries 2012.03.09 11:56 #11 kwng111: kwngさんの投稿はmadmax3の解決策にはなっていないように見えますが、すみません。 void CloseAll()という関数()の中でトレードを修正する必要はありません。 また、OrderSymbol()とOrderMagicNumber()を選択する必要があります。 そして、この部分のプログラムでは } for (int i =1; i < OrdersTotal(); i++) { if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) { OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue); } } pendingtradesはまだ修正されるでしょう。 削除済み 2012.03.09 12:52 #12 以下は、EA全体の修正コードです。 //+------------------------------------------------------------------+ //| TimeBasedEA.mq4 | //| Copyright © 2008, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ //changed by: "forex4capital@yahoo.ca" //changed again by: madmax3 // Time frame: M5 and higher extern int MagicNumber = 20080122; extern double DistancefromAsk; extern double DistancefromBid; extern double TakeProfit = 28; extern double StopLoss = 55; extern double Lots = 0.1; extern int StartHour = 2300; // Open Trade time extern bool OpenBuy = true; extern bool OpenSell = true; extern int NumBuys = 1; extern int NumSells = 1; extern int Slippage = 2; //+------------------------------------------------------------------+ //| S T A R T | //+------------------------------------------------------------------+ int start() { int cnt, ticket, total; if (TimeDayOfWeek(TimeCurrent())==5 && TimeCurrent()>=StrToTime("22:59")) { CloseAll(); return(0); } int ct; //-------------------------------------+ if(Bars<100) { Print("bars less than 100"); return(0); } //-------------------------------------+ //-------------------------------------+ if(TakeProfit<10) { Print("TakeProfit less than 10"); return(0); // check TakeProfit } //-------------------------------------+ ct = Hour() * 100 + Minute(); total=OrdersTotal(); if(total<1) { // no opened orders identified if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // check for long position (BUY) possibility if(ct == StartHour && Close[1]>Open[1] && OpenBuy) //if(ct == StartHour && High[1]<Open[0] && OpenBuy) { for ( cnt = 0; cnt < NumBuys; cnt++) { ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromAsk*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromBid*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); } return; } // check for short position (SELL) possibility if(ct == StartHour && Close[1]<Open[1] && OpenSell) //if(ct == StartHour && Low[1]>Open[0] && OpenSell) { for ( cnt = 0; cnt < NumSells; cnt++) { ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromAsk*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromBid*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); } return; } } for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if ( OrderSelect(iPos, SELECT_BY_POS) // Only my orders w/ && OrderMagicNumber() == MagicNumber // my magic number && OrderSymbol() == "EURUSD" // and my pair. ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue); if (!OrderSelect(iPos, SELECT_BY_POS)) Alert("OrderSelect failed: ", GetLastError());} return(0); } void CloseAll() { for(int cnt=OrdersTotal()-1;cnt>=0;cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if (OrderMagicNumber()!=MagicNumber) continue; // // // // // if (OrderType()==OP_BUY || OrderType()==OP_SELL) { for(int c=0; c<3; c++) { RefreshRates(); if (OrderType()==OP_BUY) { double cp = Bid;} else { cp = Ask;} OrderClose(OrderTicket(),OrderLots(),cp,0,Yellow); int err=GetLastError(); if(err==4 || err==136 || err==137 || err==138 || err==146) { Sleep(5000); continue; } break; } break; } } } // the end. CloseAll()関数は、取引が長く続いた場合に、指定した時間に取引を終了させるためにあります。 この部分は、私が解明しようとしているコードの修正部分です。 (MagicNumberとSymbolがあるのがわかると思いますが、保留中の注文だけが まだ修正されています) for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if ( OrderSelect(iPos, SELECT_BY_POS) // Only my orders w/ && OrderMagicNumber() == MagicNumber // my magic number && OrderSymbol() == "EURUSD" // and my pair. ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue); if (!OrderSelect(iPos, SELECT_BY_POS)) Alert("OrderSelect failed: ", GetLastError());} William Roeder 2012.03.09 12:54 #13 deVries: } for (int i =1; i < OrdersTotal(); i++) { if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) { OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue); } } for(int cnt=OrdersTotal()-1;cnt>=0;cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); int total=OrdersTotal(); if(total>1) 昨日、セレクトが使えない と言われたんですね。 そして、リターンコードをテスト する必要があること、合計について あなたがわざわざ書き込みを読んでコードを修正するつもりがないなら、私たちはわざわざあなたを助けようとするつもりはないのです。 削除済み 2012.03.09 13:06 #14 WHRoeder: 昨日、セレクトが機能 しないと言われましたね。 そして、リターンコードやアバウトトータルをテスト しなければならないと あなたがわざわざ書き込みを読んでコードを修正するつもりがないなら、私たちはわざわざあなたを助けようとするつもりはないのです。 私は上記の2つを実行しました。私はdeVriesではなく、オリジナルの投稿者であり、コードをこのように変更しました(以前投稿したとおり)。 for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if ( OrderSelect(iPos, SELECT_BY_POS) // Only my orders w/ && OrderMagicNumber() == MagicNumber // my magic number && OrderSymbol() == "EURUSD" // and my pair. ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue); if (!OrderSelect(iPos, SELECT_BY_POS)) Alert("OrderSelect failed: ", GetLastError());} 問題は、保留中の注文を修正する一方で、同じシンボルからの2つのオープンオーダーが同時に実行されている場合にのみ、オープンオーダーを修正するようにしたいことです。異なる番号の組み合わせとOrderSelect番号を試しましたが、まだ困っています。 Simon Gniadkowski 2012.03.09 13:13 #15 madmax3: 私は上記の両方を行いました。私はdeVriesではなく、オリジナルの投稿者であり、コードをこのように変更しました(以前に投稿したもの)。 問題は、保留中の注文を修正する一方で、同じシンボルからの2つのオープンオーダーが同時に実行されている場合にのみ、オープンオーダーを修正するようにしたいことです。異なる番号の組み合わせとOrderSelect番号を試しましたが、まだ解決していません。 だから、あなたは、あなたのオープンオーダーをループする必要があり、あなたが上記のようにシンボルとマジックナンバーをチェックします ... しかし、あなたはまた、OrderType() <=OP_SELL... 一致するオーダーをカウントし、それが2であれば ... それから、もう一度ループしてOrderModify() を実行します。 各関数のドキュメントを読んで、どのように動作するかを把握するしかないでしょう ... 例: OrderType() 削除済み 2012.03.13 14:10 #16 様々なコードを試しましたが、まだ正確に動作させることができません。2つの取引が開いているときに、開いている取引の1つを修正し、それはそれを修正し続ける、私はそれが一度だけ変更される必要があり、私は両方の取引が変更される必要があります。 for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--) if ( OrderSelect(iPos, SELECT_BY_POS) // Only my orders w/ && OrderMagicNumber() == MagicNumber // my magic number && OrderSymbol() == "EURUSD" // and my pair. && (OrderType() <= OP_SELL) ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue); if (OrderSelect(iPos, SELECT_BY_POS)) if (OrderType() <= OP_BUY) if (!OrderSelect(iPos, SELECT_BY_POS)) {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);} if (!OrderSelect(iPos, SELECT_BY_POS)) Alert("OrderSelect failed: ", GetLastError());} return(0); } for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--) if ( OrderSelect(iPos, SELECT_BY_POS) // Only my orders w/ && OrderMagicNumber() == MagicNumber // my magic number && OrderSymbol() == "EURUSD" // and my pair. && (OrderType() <= OP_SELL) && (OrderType() <=OP_BUY) ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);} if (OrderSelect(iPos-1, SELECT_BY_POS)) {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue); return(0); }} どうすればいいのか、何か提案はありますか?私はドキュメントを読み上げました。 Simon Gniadkowski 2012.03.13 15:19 #17 注文を変更する前と変更した後では何が違うのですか? 何が変わるのですか? 削除済み 2012.03.13 15:43 #18 最初に2つの注文がセットされ、そのうちの1つ(特定日をテストしたときはこの場合売り)が実行されます。その後、2つ目の注文(まだ残っている)が執行され、この取引は買いです。 売りは注文1、買いは注文2です。買い(注文2)のTakeProfitは16.3ピップ修正され(なぜ20ピップ追加されないのか分かりません)、その後TakeProfitは同じ分間に0.2ピップ増加し、これが起こり続け、TakeProfitは一日中継続的に修正され、時には増加し、時には減少し、なぜこれが起こっているのかは不明です。 編集:16.3pipsとさらに変化しているのは、スプレッドの影響もあるのではないでしょうか? Simon Gniadkowski 2012.03.13 16:04 #19 よし、最初に戻ろうか. あなたが2つの注文を変更しようとしていることは知っています ... ... しかし、あなたは正確に何をしようとしているのか? SLを尾行する? William Roeder 2012.03.13 16:11 #20 madmax3 2012.03.09 15:06 WHRoeder です。 昨日、セレクトがうまくいかない と言われましたね。 そして、リターンコードのテストが 必要であること、合計について もしあなたがわざわざ投稿を読んでコードを修正するつもりがないなら、私たちはわざわざあなたを助けようとするつもりはありません。 私は上記の両方を行っています。 私が参考にしたのは、あなたの直接の前の投稿 です madmax3 2012.03.09 14:52 EA全体の改正コードはこちらです。 total=OrdersTotal(); if(total<1) これはまだ私が述べた 問題点を示しています。 12345 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
kwngさんの投稿はmadmax3の解決策にはなっていないように見えますが、すみません。
void CloseAll()という関数()の中でトレードを修正する必要はありません。
また、OrderSymbol()とOrderMagicNumber()を選択する必要があります。
そして、この部分のプログラムでは
pendingtradesはまだ修正されるでしょう。
以下は、EA全体の修正コードです。
CloseAll()関数は、取引が長く続いた場合に、指定した時間に取引を終了させるためにあります。
この部分は、私が解明しようとしているコードの修正部分です。
(MagicNumberとSymbolがあるのがわかると思いますが、保留中の注文だけが まだ修正されています)
昨日、セレクトが使えない と言われたんですね。 そして、リターンコードをテスト する必要があること、合計について
あなたがわざわざ書き込みを読んでコードを修正するつもりがないなら、私たちはわざわざあなたを助けようとするつもりはないのです。
昨日、セレクトが機能 しないと言われましたね。 そして、リターンコードやアバウトトータルをテスト しなければならないと
あなたがわざわざ書き込みを読んでコードを修正するつもりがないなら、私たちはわざわざあなたを助けようとするつもりはないのです。
私は上記の2つを実行しました。私はdeVriesではなく、オリジナルの投稿者であり、コードをこのように変更しました(以前投稿したとおり)。
問題は、保留中の注文を修正する一方で、同じシンボルからの2つのオープンオーダーが同時に実行されている場合にのみ、オープンオーダーを修正するようにしたいことです。異なる番号の組み合わせとOrderSelect番号を試しましたが、まだ困っています。
私は上記の両方を行いました。私はdeVriesではなく、オリジナルの投稿者であり、コードをこのように変更しました(以前に投稿したもの)。
問題は、保留中の注文を修正する一方で、同じシンボルからの2つのオープンオーダーが同時に実行されている場合にのみ、オープンオーダーを修正するようにしたいことです。異なる番号の組み合わせとOrderSelect番号を試しましたが、まだ解決していません。
だから、あなたは、あなたのオープンオーダーをループする必要があり、あなたが上記のようにシンボルとマジックナンバーをチェックします ... しかし、あなたはまた、OrderType() <=OP_SELL... 一致するオーダーをカウントし、それが2であれば ... それから、もう一度ループしてOrderModify() を実行します。
各関数のドキュメントを読んで、どのように動作するかを把握するしかないでしょう ... 例: OrderType()
様々なコードを試しましたが、まだ正確に動作させることができません。2つの取引が開いているときに、開いている取引の1つを修正し、それはそれを修正し続ける、私はそれが一度だけ変更される必要があり、私は両方の取引が変更される必要があります。
どうすればいいのか、何か提案はありますか?私はドキュメントを読み上げました。
最初に2つの注文がセットされ、そのうちの1つ(特定日をテストしたときはこの場合売り)が実行されます。その後、2つ目の注文(まだ残っている)が執行され、この取引は買いです。
売りは注文1、買いは注文2です。買い(注文2)のTakeProfitは16.3ピップ修正され(なぜ20ピップ追加されないのか分かりません)、その後TakeProfitは同じ分間に0.2ピップ増加し、これが起こり続け、TakeProfitは一日中継続的に修正され、時には増加し、時には減少し、なぜこれが起こっているのかは不明です。
編集:16.3pipsとさらに変化しているのは、スプレッドの影響もあるのではないでしょうか?
昨日、セレクトがうまくいかない と言われましたね。 そして、リターンコードのテストが 必要であること、合計について
もしあなたがわざわざ投稿を読んでコードを修正するつもりがないなら、私たちはわざわざあなたを助けようとするつもりはありません。
私は上記の両方を行っています。
私が参考にしたのは、あなたの直接の前の投稿 です
EA全体の改正コードはこちらです。