Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 332

 
alexey1979621:

Fonte



Por que contar as ordens pendentes? E quem é BU();?

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

Um método estranho de "separar" as posições de uma pessoa das de outras, não seria melhor

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

Por que contar as ordens pendentes? E quem é BU();?

É um método estranho para "separar" as próprias posições dos outros, não é melhor

BU(); é uma função de Breakeven.

O que há de errado com minha versão?

сюда пересчёт рыночных позиций и отложек
Como seria no meu caso?
 
alexey1979621:
Como seria no meu caso?

Da mesma forma que parecia, apenas mais um par de aparelhos encaracolados:


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;  
   }
 
Pessoal do poço:)
 
evillive:

Da mesma forma que parecia, serão acrescentados apenas mais alguns parênteses encaracolados:


Eu corrigi, compilei, testei - o problema permanece - Quando uma determinada condição é atingida, o Consultor Especialista abre uma profissão e a fecha no Take or Stop Loss. Neste ponto, o Consultor Especialista não abre mais negócios, apesar de as condições para a abertura de negócios estarem preenchidas.

Aqui está o código na íntegra.

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:
Sobre o bem - isso é uma forquilha na água. Se é rápido, também é um pouco esticado... E se for barato, veja o ponto 1.

Então, é assim:

1. Bom é um pouco de pau na lama. 2.sobre rápido, é também uma espada de dois gumes... 3. E se for barato - veja o ponto 1.

Agora eu vejo!

 
alexey1979621:

Fixo, compilado, testado - o problema permanece - Quando uma determinada condição ocorre, o Expert Advisor abre um negócio e o fecha no Take or Stop Loss. Neste ponto, o Consultor Especialista não abre mais negócios, apesar de as condições para a abertura de negócios estarem preenchidas.

Aqui está o código na íntegra.


Onde isso conta?

bs+ss+bsts+ssts+blms+slms
Eles são globais. E eles não parecem ser reinicializados até que sejam verificados. E seus cálculos antes do cheque - onde?
 
alexey1979621:

Fixo, compilado, testado - o problema permanece - Quando uma determinada condição ocorre, o Expert Advisor abre um negócio e o fecha no Take or Stop Loss. Neste ponto, o Consultor Especialista não abre mais negócios, apesar de as condições para a abertura de negócios estarem preenchidas.

Aqui está o código na íntegra.


BU refazê-lo, você não pode apagar posições de mercado, e por causa de uma parada congelada não haverá mais posições ))))
 
alexey1979621:

Fixo, compilado, testado - o problema permanece - Quando uma determinada condição ocorre, o Expert Advisor abre um negócio e o fecha no Take or Stop Loss. Neste ponto, o Consultor Especialista não abre mais negócios, apesar de as condições para abrir negócios estarem preenchidas.

Aqui está o código na íntegra.



       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 refazê-lo, você não pode apagar posições de mercado, e por causa de uma parada de pendurar não haverá mais posições ))

))

Deixe os gurus comentarem se a função BU() precisa ou não ser quebrada (comentada), e deixe o alexey1979621 pensar, se esta função é chamada lá?

Também, se CountTrades(); função é usada assim, é igual a OrderTotal(), mais simples e mais rápido.


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