あなたのコードにあまり深く入り込んでいないのですが
なぜRefreshRatesと1秒間スリープするのでしょうか?
あなたは、バーではなくティックで計算しているので、1ティックは、一方のMAが他方のMAを最小量だけ上下に移動することによって注文をトリガーすることができます。次のティック(スリープの後)が反転した場合、MAは再び交差し、注文は閉じられます。
このアイデアは、クローズ条件が発生する(SMAが切り替わる)のを待つ間、単純にループを続けるというものです。
SMAが素早く上下に動くのはコードの問題点ですが、現在実行している2つの間に10-15pipsの差がある場合、クローズにつながる理由はないと思います?条件は、瞬時にクローズに飛ぶのではなく、whileループが制御し続けるために確実に保持しています(私の仮定では、whileループは買いでは無視されていますが、売りでは無視されています - なぜか分かりませんが)。
一方のMAが他方のMAより上か下かを確認 するだけなら、通常10~15pipsの差はないでしょう、0.1pips程度で、次のティックで簡単に逆転することができます。
あくまで私見ですが、クロスオーバーを扱う場合は、逆シグナルが多くならないように、クローズドバーでのみ計算するのがベストだと思います。
また、あなたのinitでは
int i; total=0; if (OrdersTotal()==0) { total=OrdersTotal(); } else { for (i=1; i<=OrdersTotal(); i++) //--- counter for any trades open on the pair { if (OrderSelect(i-1,SELECT_BY_POS)==true) { if (OrderSymbol()==Symbol()) { if ((OrderType()==OP_BUY)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0))) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green); //--- with an open buy if the conditions have reversed close on initiation } if ((OrderType()==OP_SELL)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)>iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0))) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green); //--- same with sell } else { total++; //--- if there are open trades yet to be completed add to tally (*) } } } } }
の else は最後の if にのみ適用されるので、もし EA が未決済の売り注文を 決済しなければ、total は 1 だけ増加します。
一方のMAがもう一方のMAより上か下かを確認するだけなら、通常10~15pipsの差はなく、0.1pips程度の差なので次のティックで簡単に逆転してしまうのではないでしょうか?
あくまで私見ですが、クロスオーバーを扱う場合、反対方向のシグナルが多くならないように、閉じたバーでのみ計算するのがベストだと思います。
はpipsの点で私の誤算でした!失礼しました。しかし、重要なのは、両者の間に確実に呼吸があり、売りを強要するクロスオーバー信号がないことです。Sleep(1000)をwhile (TimeSecond(TimeCurrent)!=59) {Sleep(1000)}に置き換えることで、ローソクの終値でのみクロスオーバーをテストすることを保証するのでしょうか?
買いの部分のOrderCloseを取り除きましたが、注文はまだ実行時に開かれ、次のピップで閉じられます :s
次にOP_BUYとOP_SELLを切り替えてみたところ、6SMAが21SMAを上回った時点で予想通り売りが成立しており、次のクロスオーバーを待っているところです(当然、当面は分足でテストしています)。
変更することがたくさんある......取り組むべきこと
あなたのEAが作成するトレードのマジックナンバーは何ですか....
それを外部入力変数にして、ユニークな番号にすれば、他のEAのトレードを閉じることもないでしょう。
int init() { //---- int i; total=0; if (OrdersTotal()==0) { total=OrdersTotal(); }
ここで何が起こるか...
for (i=1; i<=OrdersTotal(); i++) //--- counter for any trades open on the pair { if (OrderSelect(i-1,SELECT_BY_POS)==true) { if (OrderSymbol()==Symbol()) { if ((OrderType()==OP_BUY)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0))) { OrderClose( OrderTicket(),OrderLots(),OrderClosePrice(),0,Green); //--- with an open buy if the conditions have reversed close on initiation } if ((OrderType()==OP_SELL)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)>iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0))) { OrderClose(O rderTicket(),OrderLots(),OrderClosePrice(),0,Green); //--- same with sell } else { total++; //--- if there are open trades yet to be completed add to tally (*) } } }
ループの中でトレードをクローズすると失敗します。
なぜ、カウントダウンする必要があるのか、どのようにカウントダウンするのかを見るには、ここを見てください。
https://www.mql5.com/en/forum/139654
(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0)
この条件は、スプレッドを支払うすべての取引で新しいティックが来るとき、数瞬間に何度も変更することができます。
条件は常に一度だけ変わるわけではない......一つのバーで
while (AccountBalance()>50) //---- ensures an infinite loop for 1 trade a run { //---- (no infibuying!) (*) but always run //----
常に実行されているものは、それをスリープさせる
そして、通常の方法では、tickが終了し、新しいtickが来たときにstart()が再度呼び出されます。
while (TimeSeconds(TimeCurrent())!=0) //---wait until a new minute { Sleep(1000); } continue; }
このように、秒が0のときだけコードを実行すると、しばしば失敗します。
なぜなら、ある秒に新しいティックが来ないということがよくあるからです。
もし分単位の最初のティックが1秒後に来たら、新しい分単位を待たなければならず、次の分単位で新しいティックが0秒後に来ることを期待しなければなりません。
RefreshRates() 関数をチェックしてください。
4桁、5桁のブローカーと同じように動作させるなど、他にもいろいろあります。
リターンコードの確認....
スリッページあなたの値0なぜそれが必要なのか?
変更することがたくさんある......取り組むべきこと
あなたのEAが作成するトレードのマジックナンバーは何ですか....
それを外部入力変数にして、ユニークな番号にすれば、他のEAのトレードを閉じることもないでしょう。
ここで何が起こるか...
ループの中でトレードをクローズすると失敗します。
なぜ、カウントダウンする必要があるのか、どのようにカウントダウンするのかを見るには、ここを見てください。
https://www.mql5.com/en/forum/139654
この条件は、スプレッドを支払うすべての取引で新しいティックが来るとき、数瞬間に何度も変更することができます。
条件は常に一度だけ変わるわけではない......一つのバーで
常に実行されているものは、それをスリープさせる
そして、通常の方法では、tickが終了し、新しいtickが来たときにstart()が再度呼び出されます。
このように、秒が0のときだけコードを実行すると、しばしば失敗します。
なぜなら、ある秒に新しいティックが来ないということがよくあるからです。
もし分単位の最初のティックが1秒後に来たら、新しい分単位を待たなければならず、次の分単位で新しいティックが0秒後に来ることを期待しなければなりません。
RefreshRates() 関数をチェックしてください。
4桁、5桁のブローカーと同じように動作させるなど、他にもいろいろあります。
リターンコードの確認....
スリッページあなたの値0なぜそれが必要なのか?
2つのSMAが接近しているときに多くの売買注文が発生しますが、(今のところ)その心配はなく、デモ口座ではうまく動作しています。今気になっているのは、私のコードをストラテジーテスターで 実行すると、最初のポジションは正しく開くのですが、時間的に先に進むことができず、SMAがクロスオーバーしないことです。私は何を間違えているのでしょうか?私の印刷物は以下の通りです。
2013.10.22 23:41:26 2013.09.18 00:41 テスター:注文番号1がクローズされました。
2013.10.22 23:41:26 2013.09.18 00:41 SMACode3 GBPJPY,M1: 0
...
2013.10.22 23:40:53 2013.09.18 00:41 SMACode3 GBPJPY,M1: 0
2013.10.22 23:40:52 2013.09.18 00:41 SMACode3 GBPJPY,M1: 0
2013.10.22 23:40:51 2013.09.18 00:41 SMACode3 GBPJPY,M1: 0 ...
2013.10.22 23:56:18 SMACode3 GBPJPY,M1:ロード成功
コード
//+------------------------------------------------------------------+ //| SMA scripy.mq4 | //| Copyright 2013, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" extern int z=1234; int total; //---- //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int init() { //---- int i; total=0; if (OrdersTotal()!=0) { for (i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i,SELECT_BY_POS)) { if (OrderSymbol()==Symbol()) { if (OrderMagicNumber()==z) { if ((OrderType()==OP_BUY)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0))) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green); } if ((OrderType()==OP_SELL)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)>iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0))) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green); } else { total++; } } } } } } //---- return; } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int start() { //---- int i,L; while (AccountBalance()>50) { RefreshRates(); //----- double SMA6=iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0); double SMA21=iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0); double RSI70=iRSI(Symbol(),PERIOD_D1,14,PRICE_CLOSE,0)<70; double RSI30=iRSI(Symbol(),PERIOD_D1,14,PRICE_CLOSE,0)>30; //----- if (IsTesting()==true) { Sleep(60000); Print(GetLastError()); } //---- if (total==0) { if ((RSI70)&&(SMA6>SMA21)) { OrderSend(Symbol(),OP_BUY,0.1,Ask,0,0,0,"",z,0,Red); total+=1; continue; } if ((RSI30)&&(SMA6<SMA21)) { OrderSend(Symbol(),OP_SELL,0.1,Bid,0,0,0,"",z,0,Blue); total+=1; continue; } } //--- if (total!=0) { L=0; for (i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i,SELECT_BY_POS)) { if (OrderSymbol()==Symbol()) { if (OrderMagicNumber()==z) { if ((OrderType()==OP_BUY)&&(SMA6<SMA21)) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green); total+=-1; return; } if ((OrderType()==OP_SELL)&&(SMA6>SMA21)) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green); total+=-1; return; } else { L++; } } total=L; } } } } //---- } //---- return; } //--------------------------------------------------------------+
int start(){ while (AccountBalance()>50){ :
もちろん、そんなことはありません。RTFMです。スタートから戻ったときだけ、新しいティックを得ることができます。if (IsTesting()==true){ Sleep(60000); Print(GetLastError()); }
RTFMとテスターの制限 テスターの中で眠ることはできません。OrderSend(Symbol(),OP_SELL,0.1,Bid,0,0,0,"",z,0,Blue); OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);
関数の戻り値とは何ですか?どのように使用するのですか?- MQL4フォーラム
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
というわけで、他の言語に続いてmql4も勉強中なのですが、最初のEAであるシンプルな移動平均 トレーダーの最初のバージョンが完成した(と思った)ところです。昨日からずっと放置していたのですが、特に心配もなく、エントリーもエグジットも予想通りだったので、もう大丈夫だろうと思っていたのですが。今朝は様々な問題に直面しました。まず、コードを再実行すると、ポジションに関係なく売りのみとなり、現在、少しいじった後、正しいポジションで売買しますが、買い時は関係なく次のティックで取引を終了します。同じ形式を保持しているにもかかわらず、これは私が売っているときに起こっていない - なぜとして、誰かが私に方向を指し示すことができますか?
(余談ですが、私のコンピュータは、昨日一日中コードを実行することができましたが、それほど多くのハム (CPU 平均 12%) 今日はコードを実行するために地獄の鐘のように行く (~60-90%))
コード