Проверка корректности кода

 

Хотел бы попросить опытных программистов подсказать что написано неверно.

Сейчас опишу сперва как все должно работать на самом деле:

  

1)   Ждем закрытие свечи:

1.1) Если закрылась и мы определили что свеча бычья(медвежья) проверяем 1.2

1.2) Вычисляем размер свечи

1.3) Открываем 2 сделки(1 бай,1 селл) если размер свечи равен заданному диапазону, заданному в входных параметрах. (Если свеча медвежья - открываем бай по 0,03 селл по 0,01, для бычьей свечи наоборот)

2) Логика открытия следующих позиций ( с учетом того что свеча была медвежья) 

2.1) Открыты сделки buy_1 по 0,03

                             sell_1 по 0,01

2.2) Если закрылась сделка бай по стоп лосс, открываем еще одну сделку buy_2 удвоенным лотом от начального объемом и 1 сделку sell_2 удвоенным объемом

2.3) Если закрылся селл по стоп лосс ничего не делаем, ждем закрытия селл

2.3) Если  buy_2 закрылся по стоп лосс то открываем sell_3 объемом = (buy_1+buy_2+sell_1+sell_2)

2.4) Не учитываем закрытие по стоп лосс, когда стоп лосс приводит к положительному результату т.к был передвинут трейлинг стопом 

2.5) При закрытии любой сделки по тейкпрофит далее ничего не делаем ждем сигнла

Ниже приложу части кода . 

 

Определение типа свечи и проверка соответствия диапазону свечи.

// получение разницы открытия и закрытия..
bool BarsSignal_buy(int SSP=1)
  {
   double AvgRange;
   int val=false;

   AvgRange=MathAbs(iClose(SSP)-iOpen(SSP));

   if(AvgRange>=bar_1 && AvgRange<=bar)// 
     {
      if(Candle_type_sell(1))
         val=true;
      else

         val=false;
     }
   return(val);
  }
//+------------------------------------------------------------------+
// получение разницы открытия и закрытия..
bool BarsSignal_sell(int SSP=1)
  {
   double AvgRange_1;
   int val_1=false;

   AvgRange_1=MathAbs(iClose(SSP)-iOpen(SSP));

   if(AvgRange_1>=bar_1 && AvgRange_1<=bar)// bar= 0.001
     {
      if(Candle_type_buy(1))
         val_1=true;
      else
         val_1=false;
     }
   return(val_1);
  }
 

Здесь попытка написать пункт 2 описанный в начале темы. 

 

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
     {
      total_buy=PositionTotal(POSITION_TYPE_BUY);
      total_sell=PositionTotal(POSITION_TYPE_SELL);
     }

//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      double   deal_profit       =0.0;
      double   deal_volume       =0.0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      string   deal_comment      ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_profit=HistoryDealGetDouble(trans.deal,DEAL_PROFIT);
         deal_volume=HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_comment=HistoryDealGetString(trans.deal,DEAL_COMMENT);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==Magic)
         if(deal_entry==DEAL_ENTRY_OUT)
           {
            if(deal_profit>0)
              {
               //--- есть шанс, что это было закрытие по TakeProfit
               if(StringFind(deal_comment,"tp",0)==-1)
                  return;
               //--- если закрыли BUY
               if(deal_type==DEAL_TYPE_SELL)
                 {
                  if(deal_volume>lot_sell)
                    {
                     trade.Sell(lot_sell_1,_Symbol,0,0,0,CommentOrder);
                     trade.Buy(Volume,_Symbol,0,0,0,CommentOrder);
                     Sleep(stop_time);
                    }
                  if(deal_profit>0)
                    {
                     trade.Buy(lot_buy_1,_Symbol,0,0,0,CommentOrder);
                     trade.Sell(Volume,_Symbol,0,0,0,CommentOrder);
                     Sleep(stop_time);
                    }
                  //--- обнуление для BUY
                  bln_buy=false;
                 }
               //--- если закрыли SELL
               if(deal_type==DEAL_TYPE_BUY)
                 {
                  if(deal_volume>lot_buy)
                    {
                     trade.Buy(lot_buy_1,_Symbol,0,0,0,CommentOrder);
                     trade.Sell(Volume,_Symbol,0,0,0,CommentOrder);
                     Sleep(stop_time);
                    }
                  if(deal_profit>0)
                    {
                     trade.Sell(lot_sell_1,_Symbol,0,0,0,CommentOrder);
                     trade.Buy(Volume,_Symbol,0,0,0,CommentOrder);
                     Sleep(stop_time);
                    }
                  //--- обнуление для SELL
                  bln_sell=false;
                 }
              }
           }
     }
  }

     Часть кода взята из данного советника -  https://www.mql5.com/ru/code/17438

New Martin
New Martin
  • голосов: 13
  • 2017.01.20
  • Vladimir Karputov
  • www.mql5.com
New Martin - советник, который при старте открывает две противоположные позиции. Обработка OnTradeTransaction. При срабатывании Take Profit открывает позицию (ОДНУ) в ту же строну. Пересечение двух индикаторов МА - это сигнал к открытию позиции увеличенным лотом.
 
Kirill Andreev:

Определение типа свечи и проверка соответствия диапазону свечи.

// получение разницы открытия и закрытия..
bool BarsSignal_buy(int SSP=1)
  {
   double AvgRange;
   int val=false;

   AvgRange=MathAbs(iClose(SSP)-iOpen(SSP));

   if(AvgRange>=bar_1 && AvgRange<=bar)// 
     {
      if(Candle_type_sell(1))
         val=true;
      else

         val=false;
     }
   return(val);
  }
//+------------------------------------------------------------------+
// получение разницы открытия и закрытия..
bool BarsSignal_sell(int SSP=1)
  {
   double AvgRange_1;
   int val_1=false;

   AvgRange_1=MathAbs(iClose(SSP)-iOpen(SSP));

   if(AvgRange_1>=bar_1 && AvgRange_1<=bar)// bar= 0.001
     {
      if(Candle_type_buy(1))
         val_1=true;
      else
         val_1=false;
     }
   return(val_1);
  }

"bar_1" и "bar" - это input параметры первого и второго бара?

Вот так:

int val_1=false;

писать нельзя. Нужно так:

bool val_1=false;


 

 
Kirill Andreev:

Здесь попытка написать пункт 2 описанный в начале темы. 

 

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
     {
      total_buy=PositionTotal(POSITION_TYPE_BUY);
      total_sell=PositionTotal(POSITION_TYPE_SELL);
     }

//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      double   deal_profit       =0.0;
      double   deal_volume       =0.0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      string   deal_comment      ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_profit=HistoryDealGetDouble(trans.deal,DEAL_PROFIT);
         deal_volume=HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_comment=HistoryDealGetString(trans.deal,DEAL_COMMENT);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==Magic)
         if(deal_entry==DEAL_ENTRY_OUT)
           {
            if(deal_profit>0)
              {
               //--- есть шанс, что это было закрытие по TakeProfit
               if(StringFind(deal_comment,"tp",0)==-1)
                  return;
               //--- если закрыли BUY
               if(deal_type==DEAL_TYPE_SELL)
                 {
                  if(deal_volume>lot_sell)
                    {
                     trade.Sell(lot_sell_1,_Symbol,0,0,0,CommentOrder);
                     trade.Buy(Volume,_Symbol,0,0,0,CommentOrder);
                     Sleep(stop_time);
                    }
                  if(deal_profit>0)
                    {
                     trade.Buy(lot_buy_1,_Symbol,0,0,0,CommentOrder);
                     trade.Sell(Volume,_Symbol,0,0,0,CommentOrder);
                     Sleep(stop_time);
                    }
                  //--- обнуление для BUY
                  bln_buy=false;
                 }
               //--- если закрыли SELL
               if(deal_type==DEAL_TYPE_BUY)
                 {
                  if(deal_volume>lot_buy)
                    {
                     trade.Buy(lot_buy_1,_Symbol,0,0,0,CommentOrder);
                     trade.Sell(Volume,_Symbol,0,0,0,CommentOrder);
                     Sleep(stop_time);
                    }
                  if(deal_profit>0)
                    {
                     trade.Sell(lot_sell_1,_Symbol,0,0,0,CommentOrder);
                     trade.Buy(Volume,_Symbol,0,0,0,CommentOrder);
                     Sleep(stop_time);
                    }
                  //--- обнуление для SELL
                  bln_sell=false;
                 }
              }
           }
     }
  }

     Часть кода взята из данного советника -  https://www.mql5.com/ru/code/17438

                     Sleep(stop_time); - никаких пауз в торговых операциях!

Это очень, очень, плохой способ. 

 
Vladimir Karputov:

"bar_1" и "bar" - это input параметры первого и второго бара?

Вот так:

int val_1=false;

писать нельзя. Нужно так:

bool val_1=false;


 

    нет, это не input параметры 

 

 

double bar=bars_points*_Point;
double bar_1=bars_points_1*_Point;

   

вот input :

 

input int bars_points=120; // максимальный размер бара
input int bars_points_1=80;     //  минимальный размер бара
 
Vladimir Karputov:

                     Sleep(stop_time); - никаких пауз в торговых операциях!

Это очень, очень, плохой способ. 

   Вас понял.

   А остальное по выборам позиций из истории корректно ? 

 
Kirill Andreev:

   Вас понял.

   А остальное по выборам позиций из истории корректно ? 

Нет. 

Что это:

                  if(deal_volume>lot_sell)
                    {
                     trade.Sell(lot_sell_1,_Symbol,0,0,0,CommentOrder);
                     trade.Buy(Volume,_Symbol,0,0,0,CommentOrder);
                     Sleep(stop_time);
                    }
                  if(deal_profit>0)
                    {
                     trade.Buy(lot_buy_1,_Symbol,0,0,0,CommentOrder);
                     trade.Sell(Volume,_Symbol,0,0,0,CommentOrder);
                     Sleep(stop_time);
                    }

У вас может быть четыре сделки подряд, если "deal_volume>lot_sell": сначала сработает первое условие, потом сработает второе условие.

 
Kirill Andreev:

    ***

вот input :

 

input int bars_points=120; // максимальный размер бара
input int bars_points_1=80;     //  минимальный размер бара

Лучше сразу называть параметры так, чтобы они несли смысловую нагрузку. Вместо bars_points и bars_points_1:

minimum_size_bar и maximum_size_bar 

 
Vladimir Karputov:

Нет. 

Что это:

                  if(deal_volume>lot_sell)
                    {
                     trade.Sell(lot_sell_1,_Symbol,0,0,0,CommentOrder);
                     trade.Buy(Volume,_Symbol,0,0,0,CommentOrder);
                     Sleep(stop_time);
                    }
                  if(deal_profit>0)
                    {
                     trade.Buy(lot_buy_1,_Symbol,0,0,0,CommentOrder);
                     trade.Sell(Volume,_Symbol,0,0,0,CommentOrder);
                     Sleep(stop_time);
                    }

У вас может быть четыре сделки подряд, если "deal_volume>lot_sell": сначала сработает первое условие, потом сработает второе условие.

   Не понимаю как сделать правильно.

То что я записал так:

if(deal_volume>lot_sell)

 

 это вообще как читается?

 deal_volume - это по какой именно сделке берется обьем? 

 по последней?  

 
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
     {
      total_buy=PositionTotal(POSITION_TYPE_BUY);
      total_sell=PositionTotal(POSITION_TYPE_SELL);
     }

//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      double   deal_profit       =0.0;
      double   deal_volume       =0.0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      string   deal_comment      ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
Здесь deal_entry получает значение для сделки, которая создала транзакцию.