Eaが複数の同じ保留/制限注文を作成している [Help pls] 。 - ページ 3

 
GumRai:

お客様が何をしようとしているのかがわかりません

一度に1つのみオープントレードをしたい場合、新しい注文を出す前に、オープンオーダーがないことを確認します。

1つのバーに1つの取引しかしたくない場合、1つのバーにつき1回だけテストしてください

条件の組み合わせが必要な場合、その組み合わせをテストします。

ここで説明します。

私は各時間帯で最大6つのサポートと6つのレジスタンスを持っています。これは2つのサポートと2つのレジスタンスでも何でもいいのですが、各時間帯で最大6つのサポートと6つのレジスタンスがあります。

私は、各時間の開始時にこれらのS/Rレベルの指値注文を開きたい。

12のS/Rレベルに対して同じ売買コードを書く必要がないように、1つの買い関数と1つの売り関数を作りました。

今、このコードを使用すると

int SellCall(double SC)
{
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,TimeCurrent()+3540,Red);

   return(0);
}

同じ注文が複数作成されます。

WHRoederのコードも使って みました。別の関数で。私は関数の中に関数を宣言することはできませんので。

 

あなたの問題は、投稿された関数ではなく、その関数を呼び出すコードにあります。

明らかに、注文がすでに行われているかどうかのチェックがありません。

 
GumRai:

あなたの問題は、投稿された関数ではなく、その関数を呼び出すコードにあります。

明らかに、注文が既に出されているかどうかのチェックがありません。

関数を 呼び出すためのコード(スナップショット)

 if(FS == 1 || FS == 5 || FS == 7)
   {
     if( P1 == 1 || P1 ==5 || P1 ==7)
      {
      
      BuyCall(S0);
      }    
     if( P2 == 1 || P2 ==5 || P2 ==7)
      {
      
      BuyCall(S1);
      }  
     if( P3 == 1 || P3 ==5 || P3 ==7)
      {
  
      BuyCall(S2);
      }  
     if( P4 == 1 || P4 ==5 || P4 ==7)
      {
      
      BuyCall(S3);
      }      
          
     if( P5 == 1 || P5 ==5 || P5 ==7)
      {
     
      BuyCall(S4);
      }      
     if( P6 == 1 || P6 ==5 || P6 ==7)
      {
     
      BuyCall(S5);
      }  
     if( P7 == 1 || P7 ==5 || P7 ==7)
      {
      
      SellCall(R0);
      } 
     
      if( P8 == 1 || P8==5 || P8 ==7)
      {
    
      SellCall(R1);
      }  
      
     if( P9 == 1 || P9==5 || P9 ==7)
      {
      
      SellCall(R2);
      }          
          
    if( P10 == 1 || P10==5 || P10 ==7)
      {
     
      SellCall(R3);
      }   
    if( P11 == 1 || P11==5 || P11 ==7)
      {
     
      SellCall(R4);
      }                       
    if( P12 == 1 || P12==5 || P12 ==7)
      {
       
      SellCall(R5);
      }            
          
    }
   

どのように注文がすでに配置されているかどうかを確認するには?buyticket > 0 の条件で?

 
cashcube:

関数呼び出しのコード (スナップショット)

注文が既に出されているかどうかを確認する方法は?buyticket > 0 の条件で?

トリガーされていない注文を時間終了時にどのように行っているか、トリガーされた注文をどのように管理しているかが分からないので、アドバイスをすることは困難です。

グローバルに宣言された配列(または2つ)を作成し、オープンオーダーのチケット番号を格納することができます。新しい注文を開く前に、レベルに対応する配列要素に 値 >0 があるかどうかをチェックします。

もちろん、チケット番号もチェックする必要があり、トリガーされていない注文を削除する場合は、配列要素を0に設定します。 また、注文がクローズしたかどうかをチェックし、ロジックによっては0に設定し直す必要があるかもしれません。

 
GumRai:

トリガーされていない注文で時間終了時に何をしているのか、トリガーされた注文をどのように管理しているのかが分からないので、アドバイスをするのは難しいのです。

グローバルに宣言された配列(または2つ)を作成し、オープンオーダーのチケット番号を格納することができます。新しい注文を開く前に、レベルに対応する配列要素に値 >0 があるかどうかをチェックします。

もちろん、チケット番号のチェックも必要で、トリガーされていない注文を削除する場合は、配列の要素を0に設定します。また、注文がクローズしたかどうかをチェックし、ロジックによっては0に設定し直す必要があるかもしれません。

トリガーなし注文の有効期限を設定したところ、0:59または59分に失効してしまいました。トリガー注文の場合はSLとTPが設定されています。

以前は、1時間に1回、買いか売りの注文 を出すEaを設計していたのですが、コードは簡単でした。しかし、今回は非常に難しいようだ。

OK、あなたが言ったようにコード化してみます。もし問題が発生したら、ここに投稿します。さらに、チケット番号をカウントするための簡単なコード例を共有することができれば、それは良いだろう。

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

 

以下のコードで一時的に問題を解決し、時間足チャートで実行しました。シンプル

 //--- go trading only for first tiks of new bar
   if(Volume[0]>1) return(0);
 
Bars is unreliable (a refresh/reconnect can change the number of bars on the chart) volume is unreliable (miss ticks) Always use time.Bars is unreliable (a refresh/reconnect can change bar on the chart).新しいキャンドル - MQL4フォーラム
 
WHRoeder:
Bars is unreliable (a refresh/reconnect can change the number of bars on the chart) volume is unreliable (miss ticks) Always use time.Bars is unreliable (a refresh/reconnect can change the number of bars on the chart) Volume is unreliable (miss ticks).新しいローソク足 - MQL4フォーラム

コードをありがとうございました。私はそれをTick関数に追加しました。しかし、現在、私のEAはどんな取引も行っていません。私は買いコール/売りコール関数を使って保留中の注文を出しているのでこの関数を関数内に追加することができませんでした。

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{     
              BuyStopLoss = BC - (StopLoss * CalcPoint1);
              BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
              BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,TimeCurrent()+3540,Green);
         
return(0);
}


int SellCall(double SC)
{ 
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,TimeCurrent()+3540,Red);

   return(0);
}
       
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick(){
   static datetime timeCur; datetime timePre = timeCur; timeCur=Time[0];
   bool isNewBar = timeCur != timePre;
   if(isNewBar){ 
     return; // Once per bar
   }
   return; // every tick
}  

何かアイデアはありますか?

 

さらに、ストップした注文の リバーストレードも機能しない。

//-------------Reverse trade for buy
     for(xx =OrdersHistoryTotal()-1;xx >=0;xx --)
     {
         if(OrderSelect(xx, SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()== MagicNumber)
           {
          //for buy order reverse
          if(OrderType()==OP_BUY && OrderProfit()<0) // if last buy closed with loss
          { 
            //--- go trading only for first tiks of new bar
            if(Volume[0]>1) return(0);
            SellStopLoss = Bid + (StopLoss * CalcPoint1);
            SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
            SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Reverse Order",MagicNumber,0,Red);
          }
         break; 
          }
          }
     } 
 

リバースコードのハイライトはありますか?

ありがとうございました。