Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 62

 

Ребят подскажите как лучше сделать: я хочу посмотреть распределение стриков из убыточных и прибыльных сделок... я не силен в масивах. 

 

После убыточного селла 

Price_LastSell=5; Vol=Vol*Y; Izm=2; Opn_B=true; k=k+1; 

/* Buf1[p]=Buf1[p]+1; p=0;

Alert ("Прибыльные ", Buf1[1], ", ", Buf1[2], ", ", Buf1[3], ", ", Buf1[4], ", ", Buf1[5], ", ", Buf1[6], ", ", Buf1[7], ", ", Buf1[8], ", ", Buf1[9], ", ", Buf1[10]); */

 

после прибыльного селла

Price_LastSell=5; Vol=VolumeOpen; Izm=2; Opn_S=true; p=p+1; 

/* Buf2[k]=Buf2[k]+1; k=0;

Alert ("Убыточные ", Buf2[1], ", ", Buf2[2], ", ", Buf2[3], ", ", Buf2[4], ", ", Buf2[5], ",  ", Buf2[6], ", ", Buf2[7], ", ", Buf2[8], ", ", Buf2[9], ", ", Buf2[10], ", ", Buf2[11], ", ", Buf2[12], ", ", Buf2[13], ", ", Buf2[14], ", ", Buf2[15]); */ 

 

Что здесь не так? Без записи в /* все работает нормально... 

 
Сергей:

Ребят подскажите как лучше сделать: я хочу посмотреть распределение стриков из убыточных и прибыльных сделок... я не силен в масивах. 

 

После убыточного селла 

Price_LastSell=5; Vol=Vol*Y; Izm=2; Opn_B=true; k=k+1; 

/* Buf1[p]=Buf1[p]+1; p=0;

Alert ("Прибыльные ", Buf1[1], ", ", Buf1[2], ", ", Buf1[3], ", ", Buf1[4], ", ", Buf1[5], ", ", Buf1[6], ", ", Buf1[7], ", ", Buf1[8], ", ", Buf1[9], ", ", Buf1[10]); */

 

после прибыльного селла

Price_LastSell=5; Vol=VolumeOpen; Izm=2; Opn_S=true; p=p+1; 

/* Buf2[k]=Buf2[k]+1; k=0;

Alert ("Убыточные ", Buf2[1], ", ", Buf2[2], ", ", Buf2[3], ", ", Buf2[4], ", ", Buf2[5], ",  ", Buf2[6], ", ", Buf2[7], ", ", Buf2[8], ", ", Buf2[9], ", ", Buf2[10], ", ", Buf2[11], ", ", Buf2[12], ", ", Buf2[13], ", ", Buf2[14], ", ", Buf2[15]); */ 

 

Что здесь не так? Без записи в /* все работает нормально... 

Ой-ёй... А кто такие "стрики", и что такое "их распределение"?
 

Серия убыточных и прибыльных сделок. Распределение - например у нас 360 убыточных сделок (это можно посмотреть в отчете), 110 серий из 1 убыточной сделки, 80 серий из 2 убыточных сделок и 30 из 3 убыточных сделок.  

 

Я делал так:

После  определения убыточной сделки 

k=k+1;

После определения прибыльной сделки

if k==1 {k1=k1+1;}

if k==2 {k2=k2+1;}

if k==3 {k3=k3+1;}

k=0; 

Но эта запись слишком большая и неудобная при сериях из 15 и более убыточных 

 
Сергей:

Серия убыточных и прибыльных сделок. Распределение - например у нас 360 убыточных сделок (это можно посмотреть в отчете), 110 серий из 1 убыточной сделки, 80 серий из 2 убыточных сделок и 30 из 3 убыточных сделок.  

 

Я делал так:

После  определения убыточной сделки 

k=k+1;

После определения прибыльной сделки

if k==1 {k1=k1+1;}

if k==2 {k2=k2+1;}

if k==3 {k3=k3+1;}

k=0; 

Но эта запись слишком большая и неудобная при сериях из 15 и более убыточных 

Не совсем ясна ваша задача.

Вам нужно определить серию из последних прибыльных/убыточных позиций, или по всей истории торговли собрать все эти серии?

 
По всей истории. Собрать и в конце теста выдать данные. Но я делаю просто: после первой прибыльной после серии убыточных вывожу алертом количество просто через запятую... в журнале нахожу и анализирую. но мне хотелось упростить код хочу сделать через массивы. можно ли это? и как лучше сделать?
 
Ibragim Dzhanaev:

Сделал так, теперь на каждом тике не открывает, но пропускает сигналы на вход...

double tp,sl,OrderBuy=0,OrderSell=0;
double slSell,slBuy,tpSell,tpBuy,TotalBiu,TotalSell;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   for(int i=OrdersTotal()-1; i>=0; i--) //Цикл по всем ордерам
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) //Выбрали ордер
        {
         if(OrderType()==OP_BUY)
           {
            TotalBiu++;                      //Кол. покупок
           }
         if(OrderType()==OP_SELL)
           {
            TotalSell++;                     //Кол. продаж
           }
        }
     }
   double rsi=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,0);
   double rsi1=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,1);
//+------------------------------------------------------------------+

   double StopLossLevel;
   double TakeProfitLevel;
   if(StopLoss>0) StopLossLevel=Bid-StopLoss*Point; else StopLossLevel=0.0;
   if(TakeProfit>0) TakeProfitLevel=Ask+TakeProfit*Point; else TakeProfitLevel=0.0;

   tpBuy=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   slBuy=NormalizeDouble(Bid-StopLoss*_Point,_Digits);

   tpSell=NormalizeDouble(Bid-TakeProfit*_Point,_Digits);
   slSell=NormalizeDouble(Ask+StopLoss*_Point,_Digits);
///---
if(TotalBiu==0)
   if(OrderBuy<1 && rsi>Urov_70 && rsi1<Urov_70)
     {
      tiket=OrderSend(_Symbol,OP_BUY,Lot,Ask,slippage,slBuy,tpBuy,NULL,MagicNumber,0,clrBlue);      
     }
      if(TotalSell==0)    
   if(OrderSell<1 && rsi<Urov_30 && rsi1>Urov_30)
     {
      tiket=OrderSend(_Symbol,OP_SELL,Lot,Bid,slippage,slSell,tpSell,NULL,MagicNumber,0,clrRed);      
     }
  }
//+------------------------------------------------------------------+


 

подправил. должно работать

 

double tp,sl,OrderBuy=0,OrderSell=0;
double slSell,slBuy,tpSell,tpBuy,TotalBiu,TotalSell;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   for(int i=OrdersTotal()-1; i>=0; i--) //Цикл по всем ордерам
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) //Выбрали ордер
        {
         if(OrderType()==OP_BUY)
           {
            OrderBuy++;                      //Кол. покупок
           }
         if(OrderType()==OP_SELL)
           {
            OrderSell++;                     //Кол. продаж
           }
        }
     }
   double rsi=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,0);
   double rsi1=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,1);
//+------------------------------------------------------------------+

   double StopLossLevel;
   double TakeProfitLevel;
   if(StopLoss>0) StopLossLevel=Bid-StopLoss*Point; else StopLossLevel=0.0;
   if(TakeProfit>0) TakeProfitLevel=Ask+TakeProfit*Point; else TakeProfitLevel=0.0;

   tpBuy=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   slBuy=NormalizeDouble(Bid-StopLoss*_Point,_Digits);

   tpSell=NormalizeDouble(Bid-TakeProfit*_Point,_Digits);
   slSell=NormalizeDouble(Ask+StopLoss*_Point,_Digits);
///---
   if(OrderBuy==0 && rsi>Urov_70 && rsi1<Urov_70)
     {
      tiket=OrderSend(_Symbol,OP_BUY,Lot,Ask,slippage,slBuy,tpBuy,NULL,MagicNumber,0,clrBlue);  
      if(ticket<0)Print("Ошибка открытия ордера № - ",GetLastError());    
     }
   if(OrderSell==0 && rsi<Urov_30 && rsi1>Urov_30)
     {
      tiket=OrderSend(_Symbol,OP_SELL,Lot,Bid,slippage,slSell,tpSell,NULL,MagicNumber,0,clrRed);  
      if(ticket<0)Print("Ошибка открытия ордера № - ",GetLastError());    
     }
  }
//+------------------------------------------------------------------+

 

 ...

 
Sergey Gritsay:

подправил. должно работать

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   for(int i=OrdersTotal()-1; i>=0; i--) //Цикл по всем ордерам
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) //Выбрали ордер
        {
         if(OrderType()==OP_BUY)
           {
            OrderBuy++;                      //Кол. покупок
           }
         if(OrderType()==OP_SELL)
           {
            OrderSell++;                     //Кол. продаж
           }
        }
     }
   double rsi=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,0);
   double rsi1=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,1);
//+------------------------------------------------------------------+


вроде как нужно обнулить выделенное

double tp,sl,OrderBuy=0,OrderSell=0;
double slSell,slBuy,tpSell,tpBuy;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  OrderBuy=0; OrderSell=0;
//-
   for(int i=OrdersTotal()-1; i>=0; i--) //Цикл по всем ордерам
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) //Выбрали ордер
        {
         if(OrderType()==OP_BUY)
           {
            OrderBuy++;                      //Кол. покупок
           }
         if(OrderType()==OP_SELL)
           {
            OrderSell++;                     //Кол. продаж
           }
        }
     }
   double rsi=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,0);
   double rsi1=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,1);
//+------------------------------------------------------------------+
   tpBuy=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   slBuy=NormalizeDouble(Bid-StopLoss*_Point,_Digits);

   tpSell=NormalizeDouble(Bid-TakeProfit*_Point,_Digits);
   slSell=NormalizeDouble(Ask+StopLoss*_Point,_Digits);
///---
   if(OrderBuy==0 && rsi>Urov_70 && rsi1<Urov_70)
     {
      tiket=OrderSend(_Symbol,OP_BUY,Lot,Ask,slippage,slBuy,tpBuy,NULL,MagicNumber,0,clrBlue);  
      if(ticket<0)Print("Ошибка открытия ордера № - ",GetLastError());    
     }
   if(OrderSell==0 && rsi<Urov_30 && rsi1>Urov_30)
     {
      tiket=OrderSend(_Symbol,OP_SELL,Lot,Bid,slippage,slSell,tpSell,NULL,MagicNumber,0,clrRed);  
      if(ticket<0)Print("Ошибка открытия ордера № - ",GetLastError());    
     }
  }
//+------------------------------------------------------------------+
 
Vitaly Muzichenko:

вроде как нужно обнулить выделенное

double tp,sl,OrderBuy=0,OrderSell=0;
double slSell,slBuy,tpSell,tpBuy;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  OrderBuy=0; OrderSell=0;
//-
   for(int i=OrdersTotal()-1; i>=0; i--) //Цикл по всем ордерам
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) //Выбрали ордер
        {
         if(OrderType()==OP_BUY)
           {
            OrderBuy++;                      //Кол. покупок
           }
         if(OrderType()==OP_SELL)
           {
            OrderSell++;                     //Кол. продаж
           }
        }
     }
   double rsi=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,0);
   double rsi1=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,1);
//+------------------------------------------------------------------+
   tpBuy=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   slBuy=NormalizeDouble(Bid-StopLoss*_Point,_Digits);

   tpSell=NormalizeDouble(Bid-TakeProfit*_Point,_Digits);
   slSell=NormalizeDouble(Ask+StopLoss*_Point,_Digits);
///---
   if(OrderBuy==0 && rsi>Urov_70 && rsi1<Urov_70)
     {
      tiket=OrderSend(_Symbol,OP_BUY,Lot,Ask,slippage,slBuy,tpBuy,NULL,MagicNumber,0,clrBlue);  
      if(ticket<0)Print("Ошибка открытия ордера № - ",GetLastError());    
     }
   if(OrderSell==0 && rsi<Urov_30 && rsi1>Urov_30)
     {
      tiket=OrderSend(_Symbol,OP_SELL,Lot,Bid,slippage,slSell,tpSell,NULL,MagicNumber,0,clrRed);  
      if(ticket<0)Print("Ошибка открытия ордера № - ",GetLastError());    
     }
  }
//+------------------------------------------------------------------+

Спасибо. Теперь открывает некоторые ордера не по сигналу, а некоторые неправильно.

 

 
Sergey Gritsay:

подправил. должно работать

 

 

 

 ...

То, что Вы написали, не помогло...
 
Ibragim Dzhanaev:

Спасибо. Теперь открывает некоторые ордера не по сигналу, а некоторые неправильно.

 

Вы проверяете на существующем баре double rsi=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,0);

Цена идёт вверх, есть пересечение уровня 70 и вход в сделку. По факту закрытия бара вы уже видите, что РСИ ниже, но до этого то он был выше, а потом вернулся ниже уровня.

Делайте проверку на закрытом баре, тогда такого не произойдёт, и входы будут на подтверждённом сигнале:

double rsi=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,1);

double rsi1=iRSI(_Symbol,0,RSIperiod,PRICE_CLOSE,2); 

Причина обращения: