Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 332

 
alexey1979621:

Fonte



Perché contare gli ordini pendenti? E chi è BU();?

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

Uno strano metodo per "separare" le proprie posizioni da quelle degli altri, non sarebbe meglio

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

Perché contare gli ordini pendenti? E chi è BU();?

È uno strano metodo per "separare" le proprie posizioni da quelle degli altri. Non sarebbe meglio

BU(); è una funzione di pareggio.

Cosa c'è che non va nella mia variante?

сюда пересчёт рыночных позиций и отложек
Come sarebbe nel mio caso?
 
alexey1979621:
Come sarebbe nel mio caso?

Lo stesso che sembrava, solo un paio di parentesi graffe in più aggiunte:


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;  
   }
 
Bene ragazzi:)
 
evillive:

Lo stesso che sembrava, solo un paio di parentesi graffe in più saranno aggiunte:


Ho corretto, compilato, testato - il problema rimane - Quando viene raggiunta una certa condizione, l'Expert Advisor apre un trade e lo chiude al Take o Stop Loss. A questo punto, l'Expert Advisor non apre più le operazioni, nonostante siano soddisfatte le condizioni di apertura delle operazioni.

Ecco il codice per intero.

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:
A proposito di bene - quello è un forcone nell'acqua. Se è veloce, è anche un po' troppo... E se è economico, vedi punto 1.

Allora va così:

1. Il bene è un po' un bastone nel fango. 2.A proposito di velocità, è anche un'arma a doppio taglio... 3. E se è economico - vedi punto 1.

Ora capisco!

 
alexey1979621:

Risolto, compilato, testato - il problema rimane - Quando si verifica una certa condizione, l'Expert Advisor apre un trade e lo chiude al Take o Stop Loss. A questo punto, l'Expert Advisor non apre più le operazioni, nonostante siano soddisfatte le condizioni di apertura delle operazioni.

Ecco il codice per intero.


Dove conta?

bs+ss+bsts+ssts+blms+slms
Sono globali. E non sembrano resettare fino a quando non vengono controllati. E il loro calcolo prima del controllo - dove?
 
alexey1979621:

Risolto, compilato, testato - il problema rimane - Quando si verifica una certa condizione, l'Expert Advisor apre un trade e lo chiude al Take o Stop Loss. A questo punto, l'Expert Advisor non apre più le operazioni, nonostante siano soddisfatte le condizioni di apertura delle operazioni.

Ecco il codice per intero.


BU rifarlo, non si possono cancellare le posizioni di mercato, e a causa di uno stop congelato non ci saranno più posizioni ))))
 
alexey1979621:

Risolto, compilato, testato - il problema rimane - Quando si verifica una certa condizione, l'Expert Advisor apre un trade e lo chiude al Take o Stop Loss. A questo punto, l'Expert Advisor non apre più le operazioni, nonostante siano soddisfatte le condizioni di apertura delle operazioni.

Ecco il codice per intero.



       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 rifarlo, non si possono cancellare le posizioni di mercato, e a causa di uno stop sospeso non ci saranno più posizioni )))


Lasciate che i guru commentino se la funzione BU() ha bisogno di una pausa (commentata) o no, e lasciate che alexey1979621 pensi, se questa funzione è chiamata lì?

Inoltre, se la funzione CountTrades(); è usata in questo modo, è uguale a OrdersTotal(), più semplice e veloce.


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;
}
Motivazione: