オープントレードのチェックに問題がある - ページ 6

 

私は試したことがありませんが、有効とは思えません.

OrderType()==(OP_BUYSTOP||OP_SELLSTOP) &&     // The order selected is either a pending buy on stop order or a buy on sell order
OrderMagicNumber()==(Mnumber1||Mnumber1))    // The orders magic number is the same as the magic number used in this ea

私はあなたがこれを行う必要があると思います.

((OrderType()==OP_BUYSTOP)|| (OrderType()== OP_SELLSTOP)) &&     // The order selected is either a pending buy on stop order or a buy on sell order
((OrderMagicNumber()== Mnumber1) || (OrderMagicNumber()==Mnumber2))    // The orders magic number is the same as the magic number used in this ea

私がこれを考える理由は ... ... これは何に相当するのでしょうか?(OP_BUYSTOP||OP_SELLSTOP) 変数がbool ならうまくいくかもしれませんが ...intでは うまくいかないと思うんです。

一つ細かいことですが、OderDeleteの前にOderSelectは必要ありません。一般的には、OrderComment( ) OrderCommission( )などのように、int型 チケットを使用しないオーダー関数を 使用する場合のみ、OderSelectが必要になります。

 
OK ありがとうRaptor、私の投稿のコードを更新しました。カウンタにバーを 使うのは良くないという話を思い出したので、バータイムを使うように変更しました。ロジックを修正して、うまくいくかどうか見てみます。
 

OK ロジックを修正しました。しかし、まだ注文が削除されません。


前にも書きましたが、私はバーからカウンターを時々変えていました。


extern string  sComment4                = "Max Hours allowed before pending orders are deleted";
extern int     pendinglimit        = 4;

// * EVERYTIME A TRADE GETS TRIGGERED 

bartraded = TimeHour(TimeCurrent());


   if(TimeHour(TimeCurrent()) > (bartraded + pendinglimit) && Tradeopen()==true)      // Check to see if pending orders have expired
     {
        for(int tnumber = OrdersTotal()-1; tnumber >= 0 ; tnumber--)                  //scan through open orders
        {
          if (OrderSelect(tnumber, SELECT_BY_POS) &&   
             ((OrderType()==OP_BUYSTOP)|| (OrderType()== OP_SELLSTOP)) &&               // The order selected is either a pending buy on stop order or a buy on sell order
             ((OrderMagicNumber()== Mnumber1) || (OrderMagicNumber()==Mnumber3)))       // The orders magic number is the same as the magic number used in this ea
          
               {
                OrderDelete(tnumber);                                                 // Delete it
               }
        }
     }
 

dazamate:
OK ありがとうRaptor、私の投稿のコードを更新しました。カウンターにバーを使うのは良くないと皆さんが言っていたのを思い出して、バータイムを使うように変更しました。ロジックを修正して、うまくいくかどうか見てみます。
「Volume[0]==1 は信頼性が低く、1ティックを逃すとコードが壊れます。常に時間を使ってください。

は事実ですが、このコメントがなされた時の文脈を見る必要があります ... ... Barsは 信頼性が低い ... .

int Bars 

Number of bars in the current chart

しかし、それは時間数の代わりに棒グラフを使えないということではありません。 例えば、あなたのコードは金曜日の 夕方から日曜日にかけてどのように対処しますか?pendinglimitは 4時間または4小節に相当しますか?

また、22:00に取引が行われた場合、これはどうなりますか? 22 + 4 = 26 ?

if(TimeHour(TimeCurrent()) > (bartraded + pendinglimit) && Tradeopen()==true)      // Check to see if pending orders have expired
 

なるほど、時間軸の問題ですね。しかし、もしバーをカウンターとして使うなら、チャートが最大バー 数に達すると、そこでも失敗するのでは?

また何か考えてみます。

 

OK このようなアプローチはいかがでしょうか?


extern string  sComment4                = "Max Hours allowed before pending orders are deleted";
extern int     pendinglimit        = 4;
 
// * EVERYTIME A TRADE GETS TRIGGERED* 

bartraded = 0;


  if (Time0 == Time[0]) return; Time0 = Time[0];          // make sure each bar is only scanned once
       {   
//-----------------------------------------------------------------------------------------------------------------------------------------------
//TRADE COUNTER
   

   bartraded++;  // Each time a new bar opens add 1 to the counter

//------------------------------------------------------------------------------------------------------------------------------------------------
// DELETE PENDING ORDERS THAT HAVE NOT BEEN TRIGGERED WITHIN 'pendinglimit'

   if(bartraded > pendinglimit && Tradeopen()==true)      // Check to see if pending orders have expired
     {
        for(int tnumber = OrdersTotal()-1; tnumber >= 0 ; tnumber--)                  //scan through open orders
        {
          if (OrderSelect(tnumber, SELECT_BY_POS) &&   
             ((OrderType()==OP_BUYSTOP)|| (OrderType()== OP_SELLSTOP)) &&               // The order selected is either a pending buy on stop order or a buy on sell order
             ((OrderMagicNumber()== Mnumber1) || (OrderMagicNumber()==Mnumber3)))       // The orders magic number is the same as the magic number used in this ea
          
               {
                OrderDelete(tnumber);                                                 // Delete it
               }
        }
     }
 
dazamate:

なるほど、時間軸の問題ですね。しかし、カウンターとしてバーを使用する場合、チャートが最大バー数に達すると、そこでも失敗するのでは?


いいえ、現在のH1バーは常にバー0です。60分後、現在のH1バーはバー0になります。バーの問題はバー、 つまりチャート上のバーの 合計数を使うか、チャートの左端のバーを見ているかです。

TimeHour(TimeCurrent()) のバー番号は0です。取引が行われた時間のバー番号をiBarShiftを使って 取得し(これは保存しないで計算する必要があります!!)、次のようにします ... ...

if (iBarShift(symbol, TF, Time_order_Placed)+1 >  pendinglimit) && Tradeopen()==true)  
 

3度目の正直で、あなたの言わんとすることが理解できるまで時間がかかりました。そこで、私が行ったことは以下の通りです。しかし、注文はまだ削除されません >:(


static datetime tradeopened;


//Everytime a trade is opened I run
 tradeopened = TimeCurrent();


 if((iBarShift(hothand(),60 ,tradeopened)>pendinglimit) && Tradeopen()==true)          // Check to see if pending orders have expired
     {
        for(int tnumber = OrdersTotal()-1; tnumber >= 0 ; tnumber--)                  //scan through open orders
        {
          if (OrderSelect(tnumber, SELECT_BY_POS) &&   
             ((OrderType()==OP_BUYSTOP)|| (OrderType()== OP_SELLSTOP)) &&     // The order selected is either a pending buy on stop order or a buy on sell order
             ((OrderMagicNumber()== Mnumber1) || (OrderMagicNumber()==Mnumber3)))     // The orders magic number is the same as the magic number used in this ea
          
               {
                OrderDelete(tnumber);                                                 // Delete it
               }
        }
     }
 
ええ、あなたのコメントをもう一度読み返したところ、私がやったことは間違っていました。
tradeopened = TimeCurrent()
は私にバーの開始 時間を与えることはありません 私はTime[0]を使用しなければなりませんか?
 

これを試してみてください ;-)

OrderDelete(OrderTicket( ) );                    // Delete it