Помогите понять смысл кода!!!

 

Простите новичка. Не в силах сам найти ответ. Ситуация такова : скачал код эксперта с мартингейлом.  Каждая сделка(кроме первой) открывается лотом в 2 раза больше предыдущего. Лот каждой следующей сделки высчитывается как " last_price * 2 ", где " last_price " это цена по которой была открыта предыдущая сделка. Все отлично работало до тех пор пока я не прикрутил к нему трейлинг(все сделки кроме первой закрываются отдельно друг от друга по трейлингу). И проблема в том, что после закрытия сделки по трейлингу,  переменной " last_price " присваивается значение 0 и сделки перестают открываться.

По задумке, если вторая(или третья, или какая угодно, кроме первой) позиция закрывается по трейлингу, то следующая должна будет открыться лотом в два раза большим чем последняя открытая на данный момент позиция.


Я убежден что исправление нужно внести вот в этом месте. Но не понимаю этого кода и не могу поправить. Помогите.

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{
    if (trans.type == TRADE_TRANSACTION_DEAL_ADD)
    {
        long deal_type  = -1;
        long deal_entry = -1;
        long deal_magic = 0;
     
        double deal_volume = 0;
        double deal_price  = 0;
        string deal_symbol = "";

        if (HistoryDealSelect(trans.deal))
        {
           deal_type   = HistoryDealGetInteger(trans.deal, DEAL_TYPE);
           deal_entry  = HistoryDealGetInteger(trans.deal, DEAL_ENTRY);
           deal_magic  = HistoryDealGetInteger(trans.deal, DEAL_MAGIC);
           
           deal_volume = HistoryDealGetDouble(trans.deal, DEAL_VOLUME);
           deal_price  = HistoryDealGetDouble(trans.deal, DEAL_PRICE);
           deal_symbol = HistoryDealGetString(trans.deal, DEAL_SYMBOL);
        }   
        else return;
     
        if (deal_symbol == a_symbol.Name() && deal_magic == MagicNumber)
        { 
           if (deal_entry == DEAL_ENTRY_IN && (deal_type == DEAL_TYPE_BUY || deal_type == DEAL_TYPE_SELL))
           {
               last_price    = deal_price;
               last_pos_type = (deal_type == DEAL_TYPE_BUY) ? POSITION_TYPE_BUY : POSITION_TYPE_SELL;
               last_lots     = deal_volume;
           }
           else if (deal_entry == DEAL_ENTRY_OUT)
           {
               last_lots     = 0;
               last_pos_type = -1;
               last_price    =0;
           }
        }
   }   
}
 
Александр Князев:

Простите новичка. Не в силах сам найти ответ. Ситуация такова : скачал код эксперта с мартингейлом.  Каждая сделка(кроме первой) открывается лотом в 2 раза больше предыдущего. Лот каждой следующей сделки высчитывается как " last_price * 2 ", где " last_price " это цена по которой была открыта предыдущая сделка. Все отлично работало до тех пор пока я не прикрутил к нему трейлинг(все сделки кроме первой закрываются отдельно друг от друга по трейлингу). И проблема в том, что после закрытия сделки по трейлингу,  переменной " last_price " присваивается значение 0 и сделки перестают открываться.

По задумке, если вторая(или третья, или какая угодно, кроме первой) позиция закрывается по трейлингу, то следующая должна будет открыться лотом в два раза большим чем последняя открытая на данный момент позиция.

Я убежден что исправление нужно внести вот в этом месте. Но не понимаю этого кода и не могу поправить. Помогите.

При совершении каких-то торговых действия вызывается эта функция. Алгоритм выполняется, если происходит добавления новой сделки. Если удается выбрать эту сделку, алгоритм определяет ее параметры, иначе - выходит из функции. Если удалось определить параметры сделки, то алгоритм присваивает часть из них некоторым переменным (а именно: last_price, last_pos_type, last_lots), иначе - обнуляет эти три переменные.
Причина обращения: