キャンドルオープンの確認 - ページ 4

 
GumRai:

注文がないときに注文を閉じるようにチェックしていたので、小さな変更です。

コードによると、買いが終了した直後に売りが開始される理由はありません。

買いを終了する条件と、売りをオープンする条件は同じではありません。

ローソク足が開いた時だけチェックしているので、Close[0]はそのローソク足で最初に受信したティックの買値になることを思い出してください。

やあ、GumRai。

私のコードにもう少し手を貸していただけないでしょうか?もし、どのようなコードを調べればいいのか教えていただければ、まず自分でコーディングしてみて、何か質問があれば、また戻ってきます。

私が欲しいのは、一度取引が配置され、それは50ピップ(それは今何をすべきかである)で、例えば、ストップロスを 置くということです。しかし、価格が取引の方向に60ピップス動くと、それはSLをブレークイーブンに移動し、さらに取引から70ピップス離れてトレーリングストップになります。

どうすればいいでしょうか?いつものように、どんな助けでも大いに感謝します。

 

ブレイクイーブンの場合、私はいつもSLを最低でもブレイクイーブン+1ポイントに移動させます。そうすることで、後のチェックで2倍を比較する際に起こりうる問題を回避することができます。

単純に2つの条件(買いの場合)を確認する場合です。

OrderOpenPrice()>OrderStopLoss()

そして

OrderClosePrice()-OrderOpenPrice>=BreakEvenPoints*Point

SLが建値+1ポイントになるように、あるいはロックインする金額を決めて注文を変更します。

売りの場合は逆の条件ですが、最初にSLが0になった場合を考慮したコードも必要です。

OrderOpenPrice()>OrderStopLoss() || OrderStopLoss()==0 
 
GumRai:

ブレイクイーブンの場合、私はいつもSLを最低でもブレイクイーブン+1ポイントに移動させます。そうすることで、後のチェックで2倍を比較する際に起こりうる問題を回避することができます。

単純に2つの条件(買いの場合)を確認する場合です。

そして

SLが建値+1ポイントになるように、あるいはロックインする金額を決めて注文を変更します。

売りの場合は逆の条件ですが、最初にSLが0になった場合を考慮したコードも必要です。

どうもありがとうございます。実際、私がすることは、ちょうど(おおよそ)取引のための証券会社のコストをカバーするように十分なポイントを追加することです。

2行目ですが、なぜOrderclose price-OrderOpenPrice を使うのでしょうか?このコードはよく理解できませんでした。Bid-OrderOpenPriceを使えば、価格がどれだけ動いたか追跡できるからです。

私は以下の私がここでやっていることでさえ近いですか?

 if(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
           }
           if(OrderOpenPrice()>OrderStopLoss())
               if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))
                  OrderModify(BuyTicket,NULL,Bid-(50*Point),NULL,NULL,clrNONE);
        }

私は上記のcommissionをexternとして宣言しました。そして、私は代わりにBidを使用しました。

編集してください。

ということは、私が上に投稿したコードは正しくないということでしょうか(以下に見つけたものから)。MQL4 book/helpに以下のようなものがありました...これは単なるトレーリングストップのようですが、私が必要としているのはまずブレイクイーブンストップ、その後にトレーリングストップです。どのように修正すればよいのでしょうか?

 int TrailingStop = 50;
               //--- modifies Stop Loss price for buy order 
            if(TrailingStop>0)
               {
               OrderSelect(BuyTicket,SELECT_BY_TICKET);
                if(Bid-OrderOpenPrice()>Point*TrailingStop)
                {
                if(OrderStopLoss()<Bid-Point*TrailingStop)
                  {
                  bool res =OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,clrNONE);
                   if(!res)
                        Print("Error in OrderModify. Error code=",GetLastError());
                     else
                        Print("Order modified successfully.");
                    }
                 }
                 }
 
 if(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
           }
           if(OrderOpenPrice()>OrderStopLoss())
               if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))
                  OrderModify(BuyTicket,NULL,Bid-(50*Point),NULL,NULL,clrNONE);
        }

あなたのコードブロック全体は、BuyTicket==-1 を条件としています。

注文が開始された場合、BuyTicket=-1 ではないので、取引開始中に BE に移動するためのチェックは 行われません。

if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))

チケット番号と価格はどう関係するのですか?

OrderOpenPrice() を使用する前に、注文を選択する 必要が あります。

OrderClosePrice() は、買いの場合は注文が選択された時点、売りの場合は注文が選択された時点のBidです(注文がまだ開いている間)。

 
SharkWaters:

つまり、私が上に投稿したコードは間違っているのでしょうか?MQL4 book/helpに以下のようなものがありました。私が必要としているのは、まずブレークイーブンストップ、次にトレーリングストップなのですが、これは単なるトレーリングストップのようです。どのように修正すればよいでしょうか?

  int BreakEvenPoints=50;
  double BE_Decimal=BreakEvenPoints*Point;
//--- modifies Stop Loss price for buy order 
  if(BreakEvenPoints>0)
  {
   OrderSelect(BuyTicket,SELECT_BY_TICKET);
   if(Bid-OrderOpenPrice()>BE_Decimal)
     {
      if(OrderStopLoss()<OrderOpenPrice())
        {
         bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+Point,Digits),
                              OrderTakeProfit(),0,clrNONE);
         if(!res)
            Print("Error in OrderModify to BE. Error code=",GetLastError());
         else
            Print("Order modified to BE successfully.");
        }
     }
  }
これを試してみてください。
 
GumRai:
これを試してみてください。

ご指摘ありがとうございます。必要な変更を行いました。コンパイルすると、「'OrderSelect'の戻り値をチェックする必要がある」というアラートが表示されます。これは不思議なことに、買いが1つだけ発動して、残りはまた4108のエラーコードに なるのです。売りは問題なく動作しています(これについては何の変更も加えていません)。

しかし、私が追加したのは真ん中のこのコードだけなので、この部分はそうではないはずです。しかし、私が追加したのは真ん中のこのコードだけなので、この部分はそうなるはずです。残りの部分は以前と同じで、完全にうまく動作しています。私はここで何を間違えているのでしょうか?

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(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
               }
           }
   //Stop Order Modify for buy starts here
         int BreakEvenPoints=50;
         double BE_Decimal=BreakEvenPoints*Point;
         
         if(BreakEvenPoints>0)
              {
               OrderSelect(BuyTicket,SELECT_BY_TICKET);
               if(Bid-OrderOpenPrice()>BE_Decimal)
                 {
                  if(OrderStopLoss()<OrderOpenPrice())
                    {
                     bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+Point,Digits),OrderTakeProfit(),0,clrNONE);
                     if(!res)
                        Print("Error in OrderModify to BE. Error code=",GetLastError());
                     else
                        Print("Order modified to BE successfully.");
                    }
                 }
              }
      else
      if(OrderSelect(BuyTicket,SELECT_BY_TICKET))
        {
         if(OrderCloseTime()==0)
           {
            if(Close[0]<PreviousSlow)
              {
               bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
               if(CloseTicket)
                  BuyTicket=-1;
              }
           }
         else
            BuyTicket=-1; //Order has closed so reset variable
        }
        

更新しました。

さらにググって、以下のように変更しました。

int BreakEvenPoints=50;
         double BE_Decimal=BreakEvenPoints*Point;
         
         if(BreakEvenPoints>0)
              {
               if (OrderSelect(BuyTicket,SELECT_BY_TICKET))
               {
               if(Bid-OrderOpenPrice()>BE_Decimal)
                 {
                  if(OrderStopLoss()<OrderOpenPrice())
                    {
                     bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+10*Point,Digits),OrderTakeProfit(),0,clrNONE);
                     if(!res)
                        Print("Error in OrderModify to BE. Error code=",GetLastError());
                     else
                        Print("Order modified to BE successfully.");
                    }
                  }  
                 }
              }


これで、コンパイルをクリックしたときに発生するエラーはなくなりました。しかし、JournalにOrderModifyエラー4108が発生したままです。

 

すべてのコードは、if条件の中に含まれています。

 if(bar_time!=Time[0])  

に含まれているので、新しいバーごとに一度だけ実行されます。

 

BuyTicket == -1 の場合、チケット番号が -1 の注文を選択しようとしていますが、当然ながらそれは存在しません。

注文を選択しようとする前に、BuyTicket>0であることを確認して ください。

 
GumRai:

すべてのコードは、if条件の中に含まれています。

に含まれているので、新しいバーごとに一度だけ実行されます。


ご指摘ありがとうございます。

そのため、Startのすぐ後に余分なブラケットを作成し、次のようにしました。

int start() 
{
{

そして、1つのブラケットを閉じ(これでif(bar_time!=Time[0]) セクション全体が終了します)、コードを最後に置き、リターン (0); と終了ブラケットで start() を閉じました。

コードにもバックテスト・ ジャーナルにもエラーはありませんでしたが、たった一度の買い取引で、それも、価格はオープンから高くは動かず、ましてや50ピップも動かなかったのに、オープンですぐに閉じました。

これは、あなたがおっしゃるように、BuyTicketが== -1であることと関係があるのかもしれませんね。しかし、正直なところ、それをどのように変更すればいいのかわかりません。最初のコードにあなたの推薦に基づいて-1というのを入れてみたのですが、それは素晴らしく機能しました。しかし、注文を選択しようとする前に、BuyTicket>0を どのように確認 すればよいのでしょうか?

 
SharkWaters:

しかし、注文を選択しようとする前にBuyTicket>0 であることをどのように確認 するのでしょうか?

申し訳ありませんが、このような質問をしなければならない場合、あなたの知識レベルに対してあまりにも複雑なコードを書こうとしていることになります。

私はあなたのために少しづつコードを書くことができません。