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

 
kwng111:


kwngさんの投稿はmadmax3の解決策にはなっていないように見えますが、すみません。

void CloseAll()という関数()の中でトレードを修正する必要はありません。
また、OrderSymbol()とOrderMagicNumber()を選択する必要があります。

そして、この部分のプログラムでは

        }
        for (int i =1; i < OrdersTotal(); i++) {
    if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) {
        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    }
}

pendingtradesはまだ修正されるでしょう。

 

以下は、EA全体の修正コードです。

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

     }
 
     for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}


   return(0);
  }
  
  
  
  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.

CloseAll()関数は、取引が長く続いた場合に、指定した時間に取引を終了させるためにあります。

この部分は、私が解明しようとしているコードの修正部分です。
(MagicNumberとSymbolがあるのがわかると思いますが、保留中の注文だけが まだ修正されています)

     for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}
 
deVries:
        }
        for (int i =1; i < OrdersTotal(); i++) {
    if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) {
        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    }
}

for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
int total=OrdersTotal();
 if(total>1)

昨日、セレクトが使えない と言われたんですね。 そして、リターンコードをテスト する必要があること、合計について

あなたがわざわざ書き込みを読んでコードを修正するつもりがないなら、私たちはわざわざあなたを助けようとするつもりはないのです。

 
WHRoeder:

昨日、セレクトが機能 しないと言われましたね。 そして、リターンコードやアバウトトータルをテスト しなければならないと

あなたがわざわざ書き込みを読んでコードを修正するつもりがないなら、私たちはわざわざあなたを助けようとするつもりはないのです。


私は上記の2つを実行しました。私はdeVriesではなく、オリジナルの投稿者であり、コードをこのように変更しました(以前投稿したとおり)。

   for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}

問題は、保留中の注文を修正する一方で、同じシンボルからの2つのオープンオーダーが同時に実行されている場合にのみ、オープンオーダーを修正するようにしたいことです。異なる番号の組み合わせとOrderSelect番号を試しましたが、まだ困っています。

 
madmax3:


私は上記の両方を行いました。私はdeVriesではなく、オリジナルの投稿者であり、コードをこのように変更しました(以前に投稿したもの)。

問題は、保留中の注文を修正する一方で、同じシンボルからの2つのオープンオーダーが同時に実行されている場合にのみ、オープンオーダーを修正するようにしたいことです。異なる番号の組み合わせとOrderSelect番号を試しましたが、まだ解決していません。

だから、あなたは、あなたのオープンオーダーをループする必要があり、あなたが上記のようにシンボルとマジックナンバーをチェックします ... しかし、あなたはまた、OrderType() <=OP_SELL... 一致するオーダーをカウントし、それが2であれば ... それから、もう一度ループしてOrderModify() を実行します。

各関数のドキュメントを読んで、どのように動作するかを把握するしかないでしょう ... 例: OrderType()

 

様々なコードを試しましたが、まだ正確に動作させることができません。2つの取引が開いているときに、開いている取引の1つを修正し、それはそれを修正し続ける、私はそれが一度だけ変更される必要があり、私は両方の取引が変更される必要があります。

     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_SELL)
    
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    
   if (OrderSelect(iPos, SELECT_BY_POS))
    if (OrderType() <= OP_BUY)
      if (!OrderSelect(iPos, SELECT_BY_POS))
      {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);}
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}


   return(0);
  }
     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_SELL)
    && (OrderType() <=OP_BUY)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);}
    
   if  (OrderSelect(iPos-1, SELECT_BY_POS))
    {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);



   return(0);
  }}

どうすればいいのか、何か提案はありますか?私はドキュメントを読み上げました。

 
注文を変更する前と変更した後では何が違うのですか? 何が変わるのですか?
 

最初に2つの注文がセットされ、そのうちの1つ(特定日をテストしたときはこの場合売り)が実行されます。その後、2つ目の注文(まだ残っている)が執行され、この取引は買いです。
売りは注文1、買いは注文2です。買い(注文2)のTakeProfitは16.3ピップ修正され(なぜ20ピップ追加されないのか分かりません)、その後TakeProfitは同じ分間に0.2ピップ増加し、これが起こり続け、TakeProfitは一日中継続的に修正され、時には増加し、時には減少し、なぜこれが起こっているのかは不明です。

編集:16.3pipsとさらに変化しているのは、スプレッドの影響もあるのではないでしょうか?

 
よし、最初に戻ろうか. あなたが2つの注文を変更しようとしていることは知っています ... ... しかし、あなたは正確に何をしようとしているのか? SLを尾行する?
 
madmax3 2012.03.09 15:06
WHRoeder です。

昨日、セレクトがうまくいかない と言われましたね。 そして、リターンコードのテストが 必要であること、合計について

もしあなたがわざわざ投稿を読んでコードを修正するつもりがないなら、私たちはわざわざあなたを助けようとするつもりはありません。


私は上記の両方を行っています。

私が参考にしたのは、あなたの直接の前の投稿 です

madmax3 2012.03.09 14:52
EA全体の改正コードはこちらです。
   total=OrdersTotal();
   if(total<1) 
これはまだ私が述べた 問題点を示しています。