//Функция должна после n - убыточных сделок увеличивать лот на заданный коэффициентdouble Martin_Lot(double martin_L)
{
double new_lot = 0;
ulong ticket=0;
int new_loss = 0;
if(!InpMartin)
{
Print("Мартингейл выключен в настройках");
return(martin_L);
}
// получаю доступ к историиdatetime from_date=0; // с самого началаdatetime to_date=TimeCurrent(); // по текущий моментHistorySelect(from_date,to_date); // запрашиваю историю сделок в указанном интервалеint deals=HistoryDealsTotal(); // получаю количество сделок в историиPrint("сделок в истории = ",deals);
for(int i=deals-1; i>=0; i--) // обрабатываю каждую сделку (с конца??)
{
if((ticket=HistoryDealGetTicket(i))>0) // тикет сделки номер(i)
{
// свойства сделкиstring symbol= HistoryDealGetString(ticket,DEAL_SYMBOL);
long type = HistoryDealGetInteger(ticket,DEAL_TYPE); // тип торговой операцииlong entry = HistoryDealGetInteger(ticket,DEAL_ENTRY); // Направление сделки – вход в рынок, выход из рынка или разворотlong deal_magic= HistoryDealGetInteger(ticket,DEAL_MAGIC);
double profit= HistoryDealGetDouble(ticket,DEAL_PROFIT); // Финансовый результат сделкиdouble deal_commission= HistoryDealGetDouble(ticket,DEAL_COMMISSION); // Комиссия по сделкеdouble deal_swap= HistoryDealGetDouble(ticket,DEAL_SWAP); // Накопленный своп при закрытииdouble deal_volume= HistoryDealGetDouble(ticket,DEAL_VOLUME); // объем операцииdouble price= HistoryDealGetDouble(ticket,DEAL_PRICE); // Цена сделкиdatetime transaction_time=(datetime)HistoryDealGetInteger(ticket,DEAL_TIME); // время совершения сделкиlong position_ID= HistoryDealGetInteger(ticket,DEAL_POSITION_ID); // идентификатор позицииif(symbol==m_symbol.Name() && deal_magic==m_magic)
if(entry==DEAL_ENTRY_OUT && (type==DEAL_TYPE_BUY || type==DEAL_TYPE_SELL)) // Направление сделки. DEAL_ENTRY_OUT- Выход из рынка
{
if((deal_commission + deal_swap + profit)>0.0)
{
new_lot= martin_L; // лот приводим к начальному
new_loss = 0; // обнуляю счетчик убыточных сделок break;
}
}
if(new_loss==InpMartinOrdinalNumber) // порядковый номер убыточной сделки (№ 2), начиная с которой будет производится увеличение объема
{
new_lot= martin_L * KLot; //увеличиваем следующий лот на коэффициент KLotnew_loss++; // это возможно вынести перед этой области if
}
}
}
return(new_lot);
}
будет 2-я убыточная, тогда и заработает скорее всего
либо искать ошибку в коде, почему не может найти вторую убыточную, если она по факту есть
Задачу решил. Как и предполагалось ошибка была логической. Рабочий код выкладываю, может кому пригодится. Всем спасибо, кто проявил участие.
double Martin_Lot(double martin_L)
{
bool ord;
double TotalLot=0;
// если мартингейл выключен, выставляем расчитываемый "базовый лот"if(!InpMartin)
{
Print("Мартингейл выключен в настройках");
return(martin_L);
}
// получаю доступ к историиdatetime from_date=0; // с самого началаdatetime to_date=TimeCurrent(); // по текущий моментHistorySelect(from_date,to_date); // запрашиваю историю сделок в указанном интервалеint deals=HistoryDealsTotal(); // получаю количество сделок в историиPrint("сделок в истории = ",deals);
for(int i=deals-1; i>=0; i--) // обрабатываю каждую сделку (с конца??)
{
ulong ticket=HistoryDealGetTicket(i);
ord=HistoryDealSelect(ticket); // Выбирает в истории сделку для дальнейших обращений к ней через соответствующие функцииif ( ord && HistoryDealGetString(ticket,DEAL_SYMBOL) == _Symbol
&& HistoryDealGetInteger(ticket,DEAL_MAGIC) == m_magic
&& HistoryDealGetInteger(ticket,DEAL_ENTRY) == DEAL_ENTRY_OUT ) // Направление сделки. DEAL_ENTRY_OUT- Выход из рынка
{
if ( HistoryDealGetDouble(ticket,DEAL_PROFIT) + // Финансовый результат сделки HistoryDealGetDouble(ticket,DEAL_COMMISSION) + // Комиссия по сделкеHistoryDealGetDouble(ticket,DEAL_SWAP) < 0 ) // Накопленный своп при закрытии
{
TotalLot+=HistoryDealGetDouble(ticket,DEAL_VOLUME); // объем операции
}
else
{
break;
}
}
}
return TotalLot == 0 ? martin_L: TotalLot;
}
Добрый день! Прошу Вас помочь разобраться - почему не работает функция для расчета и объединения Тейк профита для всех позиций в Мартине.
void LinePribl() // название функции c переменной для закрытия позиций
{
double iSwap = 0; // создаем переменные для увеличения свопа с нулевым значениемdouble iAverage = 0; // создаем переменные для увеличения начальной цены с нулевым значениемdouble ii_Lt = 0; // создаем переменные для увеличения объема лота с нулевым значениемdouble iPrib = 0; // создаем переменную для расчета линии по Мартину с нулевым значениемfor(int qt = PositionsTotal()-1; qt >= 0; qt--) // то объявляем цикл, где кол-во позиций, условие выполнения цыкла и счетчик циклов
{
if(PositionGetSymbol(qt) ==_Symbol && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && PositionGetInteger(POSITION_MAGIC) == MagikMrtn) // выбираем позицию для дальнейшего доступа к ее свойствам
{
iSwap += c_posit.Swap(); // суммируем накопленный своп
ii_Lt += c_posit.Volume(); // суммируем накопленный объем лота
iAverage += c_posit.PriceOpen() * c_posit.Volume(); // суммируем - цену позиции умноженную на объем лота
iPrib = NormalizeDouble((iAverage + ((Mart - iSwap) / TickVAL) * _Point) / ii_Lt, _Digits); // рассчитываем установку Тейк Профита
}
if(c_posit.PositionType() == POSITION_TYPE_BUY && c_posit.TakeProfit(() != 0 && M_Tick.bid - c_posit.TakeProfit() > iPrib * _Point)
// если позиция в Buy и текущий Тейк Профит не равен нулю и текущая цена по bid минус текущий Тейк Профит будет больше рассчитанному Тейк Профиту умноженному на размер пункта
c_trade.PositionModify(c_posit.Ticket(), M_Tick.bid + iPrib * _Point, c_posit.TakeProfit());
// то модифицируем текущий Тейк Профит в Buy - к текущей цене по bid прибавляем рассчитанный Тейк Профит умноженный на размер пункта и устанавливает новое значение Тейк Профит в Buyif(PositionGetSymbol(qt) ==_Symbol && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && PositionGetInteger(POSITION_MAGIC) == MagikMrtn) // выбираем позицию для дальнейшего доступа к ее свойствам
{
iSwap += c_posit.Swap(); // суммируем накопленный своп
iAverage += c_posit.PriceOpen() * c_posit.Volume(); // суммируем - цену позиции умноженную на объем лота
ii_Lt += c_posit.Volume(); // суммируем накопленный объем лота
iPrib = NormalizeDouble((iAverage - ((Mart - iSwap) / TickVAL) * _Point) / ii_Lt, _Digits); // рассчитываем установку Тейк Профита
}
if(c_posit.PositionType() == POSITION_TYPE_SELL && c_posit.TakeProfit() != 0 && c_posit.TakeProfit() - M_Tick.ask > iPrib * _Point)
// если тип позиции в Sell и Тейк Профит не равен нулю и Тейк Профит минус текущая цена по ask больше рассчитанному Тейк Профиту умноженному на размер пункта
c_trade.PositionModify(c_posit.Ticket(), M_Tick.ask - iPrib * _Point, c_posit.TakeProfit());
// то модифицируем Тейк Профит в Srll - от текущей цене по ask отнимаем рассчитанный Тейк Профит и устанавливает новое значение Тейк Профит в Sell
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
а так?
эта фишка пишет сколько сделок в истории?
эта фишка пишет сколько сделок в истории?
а так
эффекта никакого. По прежнему на вход функции подается лот 0.1, на выходе почему -то 0
да, пишет 1 сделка. При этом тестер график не рисует вообще
а в параметрах - 2
будет 2-я убыточная, тогда и заработает скорее всего
либо искать ошибку в коде, почему не может найти вторую убыточную, если она по факту есть
а в параметрах - 2
будет 2-я убыточная, тогда и заработает скорее всего
либо искать ошибку в коде, почему не может найти вторую убыточную, если она по факту есть
Задачу решил. Как и предполагалось ошибка была логической. Рабочий код выкладываю, может кому пригодится. Всем спасибо, кто проявил участие.
Прошу Вас помочь разобраться - почему не работает функция для расчета и объединения Тейк профита для всех позиций в Мартине.