double CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,0);
この値は、キャンドルの電流が流れている間、変化している
double CurrentCandleOpen= iOpen(NULL,0,0);
これは
BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,CurrentCandleOpen, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA", 0,0,clrLimeGreen);
CurrentCandleOpenは、多くのティックにおいて有効なエントリー価格である可能性は 低いです。
どうしてもこのロジックを使いたい場合は、新しいバーが開いたときに一度だけ計算するようにしてください。
OrderSendが失敗した場合の戻り値を確認 する
この値は、キャンドルの電流が流れている間、変化している
これは
CurrentCandleOpenは、多くのティックにおいて有効なエントリー価格である可能性は 低いです。
どうしてもこのロジックを使いたい場合は、新しいバーが開いたときに一度だけ計算するようにしてください。
OrderSendが失敗した場合の戻り値を確認する
迅速な回答ありがとうございました。私の理解が正しいかどうか確認させてください。
- CurrentSlowはまだ形成中なので、実際には機能しません。なるほど、それなら直前のローソク足で形成された移動平均の 値を使えばいいんですね。それは問題ないはずです。
- CurrentCandleOpenは移動値ではないので・・・ということは、この部分のコードは正しいということでしょうか?
- 新しいバーが開いたときに一度だけ計算するようにとのことですが、どのようにすればCandleOpenに十分に近くなるのでしょうか?それについて詳しく教えてください。どうすればいいのかよくわかりません。
中括弧内のコードは、新しいバーの最初のティックでのみ実行されます。
コードありがとうございました先程の打ち合わせ通り、以下を更新しました。
- MA の現在のスローを以前のスローに変更しました。
- Askを使ったCurrentCandleOpenを削除 しました。Askの代わりにCurrentCandleOpenを使うと、いつもトレードが成立しませんでした。しかし、それをAskに置き換えたところ、うまくいきましたが、もちろんAskがMAを越えるたびにトレードし、Candle openではトレードしないようにしました。
しかし、この後、以下のように御社のコードに入れたところ、また全くトレードをしなくなりました。これは正しく挿入できているのでしょうか?
int start() { //--- double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,1); //1 at the end signifies that we want it on candle close double CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,0); //1 at the end signifies that we want it on candle close double PreviousFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,1); //1 at the end signifies that we want it on candle close double CurrentFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,0); //1 at the end signifies that we want it on candle close double PreviousPriceClose= iClose(NULL, 0, 1); double CurrentPriceClose= iOpen(NULL, 0, 0); //----------------------Main calculation starts here static datetime bar_time=0; if(bar_time!=Time[0]) { bar_time=Time[0]; if(PreviousPriceClose<PreviousSlow && Ask>PreviousSlow) if(OrdersTotal () == 0) BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,Ask, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA", 0,0,clrLimeGreen); } //-------------- return(0); return(0); }
なぜiMAコールを新しいバーコードの外側に配置したのですか?つまり、不要なときに毎ティック 呼び出されることになり、非効率的です。
static datetime bar_time=0; if(bar_time!=Time[0]) { bar_time=Time[0]; double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo,1); double PreviousPriceClose=iClose(NULL,0,1); //You can just use Close[1] if(PreviousPriceClose<PreviousSlow && Bid>PreviousSlow) if(OrdersTotal()==0) { BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen); if(BuyTicket==-1) { //Error checking code } }
MT4チャート上の値を比較するためにAskを使用しないでください。
OrderSendが失敗した場合、エラーが発生していないか確認してください。
前のバーの最後のティックがMAより下にあった場合、新しいバーの最初のティックがMAの上にある例はあまりないでしょう。
GumRaiさん、本当にありがとうございます。私は純粋にその助けに感謝します。
あなたのコードは魅力的に動作します。私はまだここでコツを学ぼうとしていて、iMAを別にそのように単独で置いているのを見ました。代わりにあなたの方法に従います。
***頭をたたく***。
私のコードを書き直します。あなたの最後の行は、私が望んでいたことと実際に私がコード化したことの間の欠陥を指摘しました。
私が実際に行う必要があるのは、次のとおりです。
- ステップ1キャンドルは、MAの下に閉じます。
- ステップ2:ろうそくが交差し、MAの上に閉じます。
- ステップ3:新しいキャンドルオープンで取引を開始します。
最後の質問ですが、私はそれを得たと思います...
上記のステップ1では、iMA、SlowMaShiftは2でいいのでしょうか?また、iCloseは iClose(NULL,0,2)でよいのでしょうか?
アイデアがあるようですね。
コードを修正して投稿してください。私か他の誰かがコメントします。
アイデアがあるようですね。
コードを修正して投稿してください。私か他の誰かがコメントします。
私はそれを動作させることができましたGumRaiさんありがとうございます。
今、同じように、逆のルールでショートを取っています。単独ではうまくいくのですが、OrderCloseBy関数を使って、ロングが開いていて、ショートがトリガーされたら、主にロングをクローズするようにするには、どうしたらいいのかわかりません。私は以下のようにしてOrderCloseByを回避しようとしました。
int start() { //--- static datetime bar_time=0; if(bar_time!=Time[0]) { bar_time=Time[0]; double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo,1); double PreviousSlow2 = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo,2); double PreviousPriceClose=iClose(NULL,0,1); //You can just use Close[1] double PreviousPriceClose2=iClose(NULL, 0,2); if(PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips)) if(OrdersTotal()==0) { BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen); if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow) if(OrdersTotal()==1) { OrderClose(BuyTicket,LotSize,Ask,Slippage,clrPink) && OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue); } if(OrdersTotal()==0) { OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue); } } //-------------- return(0); return(0); } return(0); }
if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow) if(OrdersTotal()==1)
は条件ブロックの中にあるため、満たすことができません。
if(OrdersTotal()==0)
static datetime bar_time=0; if(bar_time!=Time[0]) { bar_time=Time[0]; double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1); double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2); double PreviousPriceClose=iClose(NULL,0,1); //You can just use Close[1] double PreviousPriceClose2=iClose(NULL,0,2); if(PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips)) { if(OrdersTotal()==0) BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen); } else if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow) { if(OrdersTotal()==1) { OrderClose(BuyTicket,LotSize,Ask,Slippage,clrPink); OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue); } else if(OrdersTotal()==0) { OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue); } } }
上記の方がより意図した通りになっていると思います。
エラーのリターンコードを確認 する必要があります。
上記は、どちらかというと、あなたの意図した通りだと思います
あなたは、エラーのリターンコードをチェックする必要があります
コードに感謝します...残念ながら、それは今ショートを複数回入力するので、実際に動作しませんでした。これは私が代わりにやってみたことですが、ロングのエントリーとエグジットを別々に分解し、ショートのエントリーとエグジットのためにその逆を作ります。そうすればもっと管理しやすくなるし、微調整もしやすくなります。まずはロングのエントリーとエグジットの部分だけ抑えて作業しています。しかし、どういうわけか、ローソク足がショートの移動平均線の下で閉じると、取引が終了しません。何が間違っているのでしょうか?エラーになります。OrderClose'の戻り値をチェックする必要があります。朝からググって解決策を探しましたが、うまくいかないようです。
static datetime bar_time=0; if(bar_time!=Time[0]) { bar_time=Time[0]; double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1); double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2); double PreviousPriceClose=iClose(NULL,0,1); //You can just use Close[1] double PreviousPriceClose2=iClose(NULL,0,2); if(PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips)) { if(OrdersTotal()==0) BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen); } else if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow && Bid<PreviousSlow) { OrderClose(BuyTicket,LotSize,Ask,Slippage,clrPink); }
更新:私はエラーコードを 取り除きましたが、クローズチケットはまだ動作しないようです。私が欲しいのは、ローソク足がMAを越えて下に閉じたら、買いを閉じることだけです。

- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
こんにちは、皆さん。
私はmql4でコーディングするのはかなり初めてで、私の最初のEAを動作させるために本当に努力しています。正直なところ、以下のことについて手助けをお願いしたいです。基本的なクロスオーバーですが、移動平均線がクロスするのではなく、価格が移動平均線をクロスするだけです。
キャンドルオープンで 以下の場合に注文をトリガーして欲しいのです。(現在のキャンドルオープンの価格が 移動平均より高い)かつ(前のキャンドルが移動平均より下に閉じた)場合、注文をトリガーする必要があります。
今のところ、メインエリアに以下のようなコードを書いています。
//+------------------------------------------------------------------+
int start()
{
//---
double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,1);
double CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,0);
double PreviousFast = iMA(NULL,0,FastMa,FastMaShift,FastMaMethod,FastMaAppliedTo,1);
double CurrentFast = iMA(NULL,0,FastMa,FastMaShift,FastMaMethod,FastMaAppliedTo,0);
double PreviousPriceClose= iClose(NULL, 0, 1);
double CurrentCandleOpen= iOpen(NULL,0,0);
//主な計算はここから
if(PreviousPriceClose<PreviousSlow && (CurrentCandleOpen>(CurrentSlow)))
if(OrdersTotal () == 0)
BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,CurrentCandleOpen,Slippage,Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA", 0,0,clrLimeGreen);
//--------------
return(0);
return(0)。
}
//+------------------------------------------------------------------+
何をやってもうまくいかないんですが、ここがおかしいんでしょうか?繰り返しになりますが、ご協力をお願いします。