キャンドルオープンの確認

 

こんにちは、皆さん。

私は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)。

}

//+------------------------------------------------------------------+

何をやってもうまくいかないんですが、ここがおかしいんでしょうか?繰り返しになりますが、ご協力をお願いします。

 
    

  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が失敗した場合の戻り値を確認 する

 
GumRai:

この値は、キャンドルの電流が流れている間、変化している

これは

CurrentCandleOpenは、多くのティックにおいて有効なエントリー価格である可能性は 低いです。

どうしてもこのロジックを使いたい場合は、新しいバーが開いたときに一度だけ計算するようにしてください。

OrderSendが失敗した場合の戻り値を確認する


迅速な回答ありがとうございました。私の理解が正しいかどうか確認させてください。

  1. CurrentSlowはまだ形成中なので、実際には機能しません。なるほど、それなら直前のローソク足で形成された移動平均の 値を使えばいいんですね。それは問題ないはずです。
  2. CurrentCandleOpenは移動値ではないので・・・ということは、この部分のコードは正しいということでしょうか?
  3. 新しいバーが開いたときに一度だけ計算するようにとのことですが、どのようにすればCandleOpenに十分に近くなるのでしょうか?それについて詳しく教えてください。どうすればいいのかよくわかりません。
GumRaiさん、ありがとうございました。

 
   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      //Code to process the signal
     }

   
中括弧 内のコードは、新しいバーの最初のティックにのみ実行されます。
 
GumRai:
中括弧内のコードは、新しいバーの最初のティックでのみ実行されます。

コードありがとうございました先程の打ち合わせ通り、以下を更新しました。

  1. MA の現在のスローを以前のスローに変更しました。
  2. 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:

アイデアがあるようですね。

コードを修正して投稿してください。私か他の誰かがコメントします。

私はそれを動作させることができました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);
           }
        }
     }

上記の方がより意図した通りになっていると思います。

エラーのリターンコードを確認 する必要があります。

 
GumRai:

上記は、どちらかというと、あなたの意図した通りだと思います

あなたは、エラーのリターンコードをチェックする必要があります

コードに感謝します...残念ながら、それは今ショートを複数回入力するので、実際に動作しませんでした。これは私が代わりにやってみたことですが、ロングのエントリーとエグジットを別々に分解し、ショートのエントリーとエグジットのためにその逆を作ります。そうすればもっと管理しやすくなるし、微調整もしやすくなります。まずはロングのエントリーとエグジットの部分だけ抑えて作業しています。しかし、どういうわけか、ローソク足がショートの移動平均線の下で閉じると、取引が終了しません。何が間違っているのでしょうか?エラーになります。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を越えて下に閉じたら、買いを閉じることだけです。

理由: