Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 332

 
alexey1979621:

Quelle



Warum werden schwebende Aufträge gezählt? Und wer ist BU();?

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

Eine seltsame Methode, die eigenen Positionen von denen anderer zu "trennen".

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

Warum werden schwebende Aufträge gezählt? Und wer ist BU();?

Es ist eine seltsame Methode, die eigenen Positionen von denen anderer Leute zu "trennen".

BU(); ist eine Breakeven-Funktion.

Was ist falsch an meiner Variante?

сюда пересчёт рыночных позиций и отложек
Wie würde das in meinem Fall aussehen?
 
alexey1979621:
Wie würde das in meinem Fall aussehen?

So wie es aussah, nur mit ein paar geschweiften Klammern mehr:


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;  
   }
 
Also Leute:)
 
evillive:

So wie es aussah, werden nur ein paar geschweifte Klammern mehr hinzugefügt:


Ich habe korrigiert, kompiliert, getestet - das Problem bleibt - wenn eine bestimmte Bedingung erreicht wird, öffnet der Expert Advisor einen Handel und schließt ihn bei Take oder Stop Loss. Zu diesem Zeitpunkt eröffnet der Expert Advisor keine Geschäfte mehr, obwohl die Bedingungen für die Eröffnung von Geschäften erfüllt sind.

Hier ist der vollständige Code.

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:
Etwa gut - das ist eine Mistgabel im Wasser. Wenn es schnell ist, ist es auch ein bisschen weit... Und wenn es billig ist, siehe Punkt 1.

Dann geht es so:

1. Gut ist ein bisschen ein Klotz am Bein. 2.Über schnell, es ist auch ein zweischneidiges Schwert... 3. Und wenn es billig ist - siehe Punkt 1.

Jetzt verstehe ich!

 
alexey1979621:

Behoben, kompiliert, getestet - das Problem bleibt - Wenn eine bestimmte Bedingung eintritt, eröffnet der Expert Advisor einen Handel und schließt ihn bei Take oder Stop Loss. Zu diesem Zeitpunkt eröffnet der Expert Advisor keine Geschäfte mehr, obwohl die Bedingungen für die Eröffnung von Geschäften erfüllt sind.

Hier ist der vollständige Code.


Wo zählt sie?

bs+ss+bsts+ssts+blms+slms
Sie sind global. Und sie scheinen nicht zurückgesetzt zu werden, bis sie überprüft werden. Und ihre Berechnung vor der Prüfung - wo?
 
alexey1979621:

Behoben, kompiliert, getestet - das Problem bleibt - Wenn eine bestimmte Bedingung eintritt, eröffnet der Expert Advisor einen Handel und schließt ihn bei Take oder Stop Loss. Zu diesem Zeitpunkt eröffnet der Expert Advisor keine Geschäfte mehr, obwohl die Bedingungen für die Eröffnung von Geschäften erfüllt sind.

Hier ist der vollständige Code.


BU wiederholen, können Sie keine Marktpositionen löschen, und aufgrund eines eingefrorenen Stopps wird es keine weiteren Positionen geben ))))
 
alexey1979621:

Behoben, kompiliert, getestet - das Problem bleibt - Wenn eine bestimmte Bedingung eintritt, eröffnet der Expert Advisor einen Handel und schließt ihn bei Take oder Stop Loss. Zu diesem Zeitpunkt eröffnet der Expert Advisor keine Geschäfte mehr, obwohl die Bedingungen für die Eröffnung von Geschäften erfüllt sind.

Hier ist der vollständige Code.



       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 wiederholen, Sie können keine Marktpositionen löschen, und wegen eines hängenden Stopps wird es keine weiteren Positionen geben )))


Lassen Sie die Gurus kommentieren, ob die Funktion BU() unterbrochen (auskommentiert) werden muss oder nicht, und lassen Sie alexey1979621 überlegen, ob diese Funktion dort aufgerufen wird?

Wenn die Funktion CountTrades(); auf diese Weise verwendet wird, entspricht sie der Funktion OrdersTotal(), ist also einfacher und schneller.


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;
}
Grund der Beschwerde: