EAに必要な簡単なコード(2つのオープンオーダーの修正) - ページ 3

 

基本的に、私は特定の時間、具体的には23:00 GMT+2だと思いますが、2つの保留中の注文を設定しました。保留中の注文の1つは売りストップ、もう1つは買いストップで、両方の注文は23:00のローソク足のオープンから同じ距離、この場合は14ピップ離れています。両方の注文のTakeProfitは28ピップス(この場合)、StopLossは55ピップスです。

両方の注文が成立したとき(注文が失効する前に23:00のローソク足の始値から14pips上下する)、両方の注文のテイクプロフィットを たとえば20pips増加させたいと思います。つまり、この場合の新しいテイクプロフィットは58pipsです。しかし、ストップロスはずっと同じままでなければなりません。基本的に私がやろうとしていることは、ある種のヘッジです。

2つの取引を開いている場合、価格が一方向に大きく動く可能性があり、両方の取引のテイクプロフィットを増やせば、損失を相殺するのに十分です。利益を得るためには、1つのトレードを開いてテイクプロフィットに到達するか、両方のトレードを開いてテイクプロフィットを打ち、一方向に大きく動くことがないようにしなければなりません。

これが明確であればいいのですが、そうでなければ、より明確になるように画像を提供します。

 
WHRoeder:

私は、あなたの直前の投稿を 参照していました

madmax3 2012.03.09 14:52
EA全体の改訂コードはこちらです。
まだ私が述べた ような問題があります。
このコードの部分は、EAの別の部分、保留中の注文を開く部分だと思うのですが、私が修正しようとしている部分に全く影響を与えないのでしょうか?すみません、特に元記事でコードの一部を混同してしまったようです。しかし、私は特に私がそれを必要とするコードの部分にあなたが述べていることをしました。
 
madmax3:

これが明確であることを望みますが、もしそうでなければ、より明確であるべき画像を提供します。

わかりました、ありがとうございます。

それで、あなたはこれらの注文を一度修正したいだけなのですね。23:00のバーをチェックして、注文が開始されるはずだったTPを決定する必要があります。

 
RaptorUK:

それは明らかです、ありがとうございます。

では、これらの注文を一度修正したいだけなのですね・・・それなら答えは簡単です。23:00のバーをチェックして、注文が開始されるべきだったTPを決定する必要があります。

しかし、修正とチェックは、2つの取引が開かれているときだけ行われるべきです。すでに持っているコードに追加するべきか、それとももう一度始めるべきか?

つまり、本質的には、2つの取引(同じシンボルとマジックナンバー)がある場合、EAは、以前に存在した保留中の注文(現在実行されている)と比較して、オープン取引の利益確定を チェックし、それらが同じであれば、それを変更する必要があり、一度ループすると、再びチェックして、それらが同じではないことがわかり、したがって、さらに取引を変更しないのでしょうか?
 
madmax3:
1. 修正とチェックは、2つの取引が開いているときだけ行われるべきですが、これを行うにはどうしたらよいでしょうか?すでに持っているコードに追加するか、もう一度始めるべきでしょうか?

2. つまり、本質的には、2つの取引(同じシンボルとマジックナンバー)がある場合、EAはオープン取引のテイクプロフィットを、以前に存在した保留中の注文(現在実行中)と比較してチェックし、それらが同じであれば変更し、一度ループすると、再度チェックして、それらが同じではないことがわかり、それ以上取引を変更しないのでしょうか?

1. 未決済注文をループし、シンボルとマジックナンバーをチェックし、一致する注文が あればカウンターを増加させます ... ... 注文のチェックが終わり、2つカウントされていれば、正しいシンボルとマジックナンバーの未決済注文が2つあります ... ... それで、それらを修正できます ... 2を見て。

2. いいえ、保留中の注文が有効化され、保留中でなくなった場合、その注文のTPを見ることはできません。 EAは23:00のバーをチェックして、元のTPが何 あったかを調べます ... それから、これを2つの未決済注文のTPと比較します ... この情報から、変更するかしないかを決定します。

 
RaptorUK:

1. 未決済注文をループし、シンボルとマジックナンバーをチェックし、一致する注文があればカウンターを増加させる ... ...注文のチェックが終わり、2つカウントされていれば、正しいシンボルとマジックナンバーの未決済注文が2つある ... ... だから、それらを修正できる ... 2を見て。

2. いいえ、保留中の注文が有効化され、保留中でなくなった場合、その注文のTPを見ることはできません。 EAは23:00のバーをチェックして、元のTPが何 あったかを調べます ... それから、これを2つの未決済注文のTPと比較します ... この情報から、修正するかしないかを決定できます。

なるほど、私がずっとやろうとしていたことだと思います。今のところ、1つの注文が修正されていますが(具体的には、私のテストでは注文2である買いの注文)、それは修正され続けています、私はそれを繰り返すのを止めるために 'break'を使用しますか?また、どのようにカウントして、2つの注文が開いているときだけ、開いている注文を修正すればいいのでしょうか?このためにOrdersTotal()を使おうとしていますが、うまくいきません。それぞれの注文のために2つの別々のコードを作る必要はないと思うのですが?
偶数のオープンオーダーだけが修正され、私が言ったように、それらは繰り返し修正されます。OrderSelect()の様々な組み合わせを試しましたが、まだ理解できません。私はこれを読みましたhttps://book.mql4.com/trading/ordermodify これは私の状況と何か関係があるのでしょうか?これはストップロスのためのものですが、私は基本的にテイクプロフィットのためにそれが必要です。

私はここで何を間違えているのでしょうか?

     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_BUY)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);}
    return(0);
    
  if (
        OrderSelect(iPos-1, SELECT_BY_POS-1)                    
    &&  OrderMagicNumber()  == MagicNumber                
    &&  OrderSymbol()       == "EURUSD"                
    && (OrderType() == OP_SELL)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);}
return(0);
  }

TPが23:00のローソク足と同じかどうかは、どのように確認すればいいのでしょうか?2つの注文があるときにオープンオーダーが修正される限り、それは同じ効果を達成するので、そのように必要なのでしょうか?それとも、注文が継続的に変更されるのを阻止するためだけでしょうか。

ありがとうございます。

madmax3

 

return(0)は、2番目のオーダーが修正される前にstart()を終了しています。

あなたがしていることは、ポジションによってオーダーを選択し、それが正しいマジックナンバーを持っていることを確認し、それが正しいシンボルであることを確認し、それがOP_BUYであることを確認しています ... それから、それを修正します、あなたはそれがすでに修正されているかどうかを判断していますか?

EAは中断されても回復できなければなりません。注文が発注され、MT4がクラッシュしても、再起動すれば中断されたところから回復できなければなりません。

このため、注文がすでに変更されているか、または変更が必要かを判断する必要があります ... どのように?

"特定の時間、具体的には 23:00 GMT+2 と思われる時間に、2 つの 保留 中の注文を 設定しました。両方の注文は23:00のローソク足からオープンまで同じ距離、この場合は14ピップス離れています。両方ともTakeProfitが28ピップ(この場合)、StopLossが55ピップ です。

23:00のローソク足を参照することで、元のTPがどこにあったかを計算することができます。

注文が変更されたことを記録する方法は他にもあり、チケット番号を記録しておき、変更されたときにその情報をファイルに書き込み、再度変更しようとするときにそのファイルを開いてチケット番号をチェックする、などなど。 オリジナルのTPとの照合はもっと簡単だと思います。

 

今のところ、こんな感じです。

//+------------------------------------------------------------------+
//|                                                  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; 
        
    
}
//---------------------------------------------------------------

 int Handle,                         // File descriptor
   Qnt_Symb;                           // Number of recorded symbols
   string File_Name="check.csv";        // File name
   
    Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening
   

         FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
          for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
      {       
       OrderSelect(iPos,SELECT_BY_POS) ;
       FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime())  //int
       
        ) ; //end file write
           }   }
           
}
//---------------------------------------------------------------   
 
     
     
  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.

上記のようなファイル書き込みコードが含まれています。

//---------------------------------------------------------------

 int Handle,                         // File descriptor
   Qnt_Symb;                           // Number of recorded symbols
   string File_Name="check.csv";        // File name
   
    Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening
   

         FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
          for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
      {       
       OrderSelect(iPos,SELECT_BY_POS) ;
       FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime())  //int
       
        ) ; //end file write
          	 FileClose(Handle); }   }
           
}
//---------------------------------------------------------------   

しかし、私はこれらのエラーが発生します。

2012.04.04 15:30:06 2012.01.16 06:25 TimeBasedEA Version 2: FileOpen - too manyopened files.

2012.04.04 15:30:06 2012.01.16 06:25 TimeBasedEA Version 2: FileWrite で invalid handle -1 が発生しました。

どうしたんだろう?

 

なぜ、最も難しい方法を選んだのですか?

ファイルへの書き込みが終わったら、ファイルを閉じる必要があります ... すでに開いているなら、もう一度開く必要はありません。

//---------------------------------------------------------------

int Handle,                         // File descriptor
    Qnt_Symb;                           // Number of recorded symbols
string File_Name="check.csv";        // File name
   
Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening    File opened here, outside the loop
   

FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
   {       
   OrderSelect(iPos,SELECT_BY_POS);
   FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime   //  this is a string - Time  to  String
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime() )  //int     //  this is a string - Time  to  String
       
        ) ; //end file write

   FileClose(Handle);      //  why close the file inside the loop when it was opened outside the loop ?
   }   
}    //  what is this code inside of ?
           
}  // end of start
//--------------------------------------------------------------- 

あなたのforループは間違っています ... ... 最後のオーダーの位置は1ではなく 0 です。

 
RaptorUK:

いったいなぜ、最も難しい選択肢を選んだのでしょうか?

これは、ファイルを使って修正とチェックを 行う方法ではないのでしょうか?それとも、修正(前回の投稿の前)とファイルのコード(これ以上修正しないことを確認するため)の両方のコードを組み合わせる必要があるのでしょうか?