どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 332

 
alexey1979621:

ソース



なぜ未決済注文をカウントするのか?また、BU();とは誰のことですか?

      if (OrderSymbol()!=Symbol() && OrderMagicNumber()!=Magic) continue;//отделяем свои ордера. Магик задается в настройках

自分の立場と他人の立場を「分ける」という不思議な方法、その方がいいのでは?

      if (OrderSymbol()=Symbol() && OrderMagicNumber()=Magic) отделяем свои ордера. Магик задается в настройках
        {сюда пересчёт рыночных позиций и отложек}
 
evillive:

なぜ未決済注文をカウントするのか?また、BU();とは誰のことですか?

自分の立場と他人の立場を「分ける」なんて、変なやり方ですね。

BU();はブレークイーブン関数です。

私のバリアントはどうしたんだ?

сюда пересчёт рыночных позиций и отложек
私の場合はどうでしょうか?
 
alexey1979621:
私の場合はどうでしょうか?

見た目は同じで、中括弧が2つほど追加されただけです。


void CountTrades() // количество открытых ордеров
   {
    for(int i=OrdersTotal()-1; i>=0; i--) 
    {
     if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
     { 
      if (OrderSymbol()=Symbol() && OrderMagicNumber()=Magic)//отделяем свои ордера. Магик задается в настройках
      {
      int typ=OrderType();      //однократный вызов функции ускоряет работу
      switch (typ)
      {
       case 0: bs++;
       case 1: ss++;
       case 2: blms++;
       case 3: slms++;
       case 4: bsts++;
       case 5: ssts++;
       default: break;
      }
      }        
     }
    }
    return;  
   }
 
まあみんな:)
 
evillive:

見た目と同じで、中括弧が2つほど追加されるだけです。


修正、コンパイル、テストをしましたが、問題は解決されませんでした。この時点で、Expert Advisorは、ディールを開くための条件が満たされているにもかかわらず、それ以上ディールを開きません。

以下は、そのコードの全文です。

extern double  Lots             = 0.1;
extern string Сomment           = "Pattern_1";
extern int TakeProfit           = 10;     
extern int StopLoss             = 0;   
extern int Step                 = 2;   
extern int StepOtl              = 4;   


extern int BULevel              = 2;
extern int   NotBULevel         = 2;         // Уровень безубытка в пунктах

extern int Slippage             = 2; // проскальзывание 
extern int Magic                = 111;

int ticket1, ticket2, bs, ss, bsts, ssts, slms, blms;//добавил колич. ордеров по типам и их тикеты
int timeprev;
double price1, price2; //цены открытия ордеров

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
      return(0);
}

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
 double SL,TP;
 int slv=MarketInfo(Symbol(),MODE_STOPLEVEL);
 if(Step<=slv || StepOtl<=slv) {Print("Step или StepOtl слишком мал"); return(0);}
 
 CountTrades();   //подсчет ордеров по типам.
 BU();
 
 //если нет рыночных ордеров-----------------------------------------
 if(bs+ss+bsts+ssts+blms+slms==0)                                     
 {
  if (Open[1]>Close[1] && Open[2]<Close[2] && High[1]>High[2] && Low[1]<Low[2])  // продажа
  {
   TP=NormalizeDouble(Bid - TakeProfit * Point, Digits);  
   SL=NormalizeDouble(Bid + StopLoss*Point,Digits);
   if(TakeProfit==0) TP=0;
   if(StopLoss==0) SL=0;                       
   ticket1=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP,"Pattern_1",Magic,0,Red);//Сразу с тейк-профитом, магик в настройках
   if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES)) price1=OrderOpenPrice();//цена первого ордера
   SL=NormalizeDouble(Bid+StepOtl*Point-StopLoss*Point,Digits);
   if(StopLoss==0) SL=0;
   ticket2=OrderSend(Symbol(),OP_BUYSTOP,Lots,NormalizeDouble(Bid+StepOtl*Point,Digits),0,SL,0,"Pattern_1",Magic,0,Blue);//тикет для BuyStop
   if(OrderSelect(ticket2,SELECT_BY_TICKET,MODE_TRADES)) price2=OrderOpenPrice();//цена второго ордера
  }
  
  if (Open[1]<Close[1] && Open[2]>Close[2] && High[1]>High[2] && Low[1]<Low[2]) // покупка
  {
   TP=NormalizeDouble(Ask + TakeProfit * Point, Digits); 
   if(TakeProfit==0) TP=0;
   SL=NormalizeDouble(Ask-StopLoss*Point,Digits);
   if(StopLoss==0) SL=0;
   ticket1=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP,"Pattern_1",Magic,0,Blue);//с тейком, магик в настройках 
   if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES)) price1=OrderOpenPrice();//цена первого ордера
   SL=NormalizeDouble(Bid-StepOtl*Point+StopLoss*Point,Digits);
   if(StopLoss==0) SL=0;
   ticket2=OrderSend(Symbol(),OP_SELLSTOP,Lots,NormalizeDouble(Bid-StepOtl*Point,Digits),0,SL,0,"Pattern_1",Magic,0,Red);//тикет для SellStop
   if(OrderSelect(ticket2,SELECT_BY_TICKET,MODE_TRADES)) price2=OrderOpenPrice();//цена второго ордера
  }
 }
 

 return(0);
}
     
 //+------------------------------------------------------------------+
void CountTrades() // количество открытых ордеров
   {
    for(int i=OrdersTotal()-1; i>=0; i--) 
    {
     if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
     { 
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)//отделяем свои ордера. Магик задается в настройках
      {
      int typ=OrderType();      //однократный вызов функции ускоряет работу
      switch (typ)
      {
       case 0: bs++;
       case 1: ss++;
       case 2: blms++;
       case 3: slms++;
       case 4: bsts++;
       case 5: ssts++;
       default: break;
      }        
     }
    }
    }
    return;  
   }
 //+------------------------------------------------------------------+

void BU()
{
 for(int a=OrdersTotal()-1; a>=0; a--)   
 {
  if (OrderSelect(a, SELECT_BY_POS, MODE_TRADES)) 
  {      
   if(OrderMagicNumber()!=Magic  || OrderSymbol()!=Symbol()) continue;
   int typ=OrderType();                                                 //вызываем функции
   int tic=OrderTicket();                                               //один раз
   double oop=OrderOpenPrice();                                         //это ускоряет работу
   double otp=OrderTakeProfit();                                        //советника
   double osl=OrderStopLoss();
   
   if(typ==OP_BUY) 
   {
    if(oop<=NormalizeDouble(Bid-BULevel*Point-NotBULevel*Point,Digits) && oop>osl)// последнеее условие БУ + 20 пипсов
    OrderModify(tic,oop,NormalizeDouble(oop+NotBULevel*Point,Digits),otp,0,Green);
    OrderDelete(ticket2,Yellow);
   }       
 
   if(typ==OP_SELL) 
   {
    if(oop>=NormalizeDouble(Ask+BULevel*Point+NotBULevel*Point,Digits) && (oop<osl || osl==0))// последнеее условие БУ + 20 пипсов
    OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-NotBULevel*Point,OrderTakeProfit(),0,Red);  
    OrderDelete(ticket2,Yellow);
   } 
  }
 }
 return;
}
 
artmedia70:
アバウトグッド - それは水の中の投石器です。速いとなると、やはりちょっと......。そして、安ければ、ポイント1参照。

すると、こんな感じになります。

1.Goodは、ちょっと棒読みです。2.速さについて、諸刃の剣でもある...。3.そして、それが安ければ......ポイント1を参照。

今、わかった!

 
alexey1979621:

修正、コンパイル、テスト - 問題が残る - 特定の条件が発生した場合、Expert Advisor は取引を開始し、Take または Stop Loss で決済します。この時点で、Expert Advisorは、ディールを開くための条件が満たされているにもかかわらず、それ以上ディールを開きません。

以下は、そのコードの全文です。


どこでカウントしているのか?

bs+ss+bsts+ssts+blms+slms
彼らはグローバルです。しかも、チェックするまでリセットされないようです。そして、チェックの前の彼らの計算 - どこに?
 
alexey1979621:

修正、コンパイル、テスト - 問題が残る - 特定の条件が発生した場合、Expert Advisor は取引を開始し、Take または Stop Loss で決済します。この時点で、Expert Advisorは、ディールを開くための条件が満たされているにもかかわらず、それ以上ディールを開きません。

以下は、そのコードの全文です。


BUはやり直し、マーケットポジションは削除できないし、ストップが凍結されているのでポジションは増えない )))
 
alexey1979621:

修正、コンパイル、テスト - 問題が残る - 特定の条件が発生した場合、Expert Advisor は取引を開始し、Take または Stop Loss で決済します。この時点で、Expert Advisorは、ディールを開くための条件が満たされているにもかかわらず、それ以上ディールを開きません。

以下は、そのコードの全文です。



       case 0: bs++;   break;
       case 1: ss++;   break;
       case 2: blms++; break;
       case 3: slms++; break;
       case 4: bsts++; break;
       case 5: ssts++; break;
       default: break;
 
evillive:
BUやり直し、マーケットポジションは削除できないし、ハンギングストップのためポジションは増えない )))


BU() 関数が ブレーク(コメントアウト)する必要があるかどうか、達人にコメントさせ、alexey1979621に、この関数がそこで呼ばれているかどうかを考えさせましょう?

また、このようにCountTrades();関数を使用すると、OrdersTotal() と同等になり、よりシンプルで高速になります。


void BU()
{
 bool bu=false;
 for(int a=OrdersTotal()-1; a>=0; a--)   
 {
  if (OrderSelect(a, SELECT_BY_POS, MODE_TRADES)) 
  {      
   if(OrderMagicNumber()==Magic  || OrderSymbol()==Symbol())
   {
   int typ=OrderType();                                                 //вызываем функции
   int tic=OrderTicket();                                               //один раз
   double oop=OrderOpenPrice();                                         //это ускоряет работу
   double otp=OrderTakeProfit();                                        //советника
   double osl=OrderStopLoss();
   
   if(typ==OP_BUY) 
   {
    if(oop<=NormalizeDouble(Bid-BULevel*Point-NotBULevel*Point,Digits) && oop>osl)// последнеее условие БУ + 20 пипсов
    OrderModify(tic,oop,NormalizeDouble(oop+NotBULevel*Point,Digits),otp,0,Green);
    bu=true;
    //break;
   }       
 
   if(typ==OP_SELL) 
   {
    if(oop>=NormalizeDouble(Ask+BULevel*Point+NotBULevel*Point,Digits) && (oop<osl || osl==0))// последнеее условие БУ + 20 пипсов
    OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-NotBULevel*Point,OrderTakeProfit(),0,Red);  
    bu=true;
    //break;
   } 
   if(bu==true && (typ==OP_BUYSTOP || typ==OP_SELLSTOP))
   {
    OrderDelete(tic,Yellow); 
    bu=false;
   }       
   }
  }
 }
 return;
}