Перейти к содержанию

Обучение языку MQL4 под MetaTrader 4


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано


в журнале не отображается ничего, кроме открытия последнего ордера.

Значит исполнение в процедуру трейлинга не заходит, там-же у Вас принты стоят - по-любому бы в журнале что-то было...
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано



в журнале не отображается ничего, кроме открытия последнего ордера.

Значит исполнение в процедуру трейлинга не заходит, там-же у Вас принты стоят - по-любому бы в журнале что-то было...


в том то и дело, что стоят принты.
Код выглядит вот так:

int start()
{
Trall();

Вызов функции:
void Trall ()
{
for (int i = 0; i {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if (Bid-OrderOpenPrice()> TrailingStop*Point)
{
if (OrderStopLoss() {
SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);
if (OrderStopLoss()!=SL)
if (OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0,0))
{
Print("Модифицирован");
}
else Print ("не модифицирован");
}
}
}
if (OrderType()== OP_SELL)
{
if (OrderOpenPrice()-Ask>TrailingStop*Point)
{
if (OrderStopLoss() >Ask+(TrailingStop+TrailingStep)*Point)
{
SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
if (OrderStopLoss()!=SL)
if (OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0))
{
Print("Модифицирован");
}
else Print ("не модифицирован");
}
}
}
}
}
}
}

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Crik1978, не работает потому, что для сделок на продажу есть нюансы при трале, не проходит по этому условию:

if (OrderStopLoss() >Ask+(TrailingStop+TrailingStep)*Point).

Пока первый StopLoss не установлен, нужно проводить сравнение с OrderOpenPrice, а уже потом можно сравнивать с OrderStopLoss . Можно в функции сделать разбивку на два условия, если OrderStopLoss() == 0 и OrderStopLoss() > 0.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано



Цитата

Да, но мы-то говорим о OrdersHistoryTotal() - эта функция фильтровать не умеет.


А выход какой-нибудь есть?
Вам нужен предпоследний закрытый Вашей совой ордер? если да, то просто добавьте в Ваш код счетчик - i++; Находите 1 ордер i=1, находите 2 - i=2 и если (i=2) break;
Если нужны все значения - то массив Profit[ i] = OrderProfit()+...; i++;


А можно поподробнее немного?
Мне нужно , чтобы сова торговала на нескольких валютных парах, но два убытка подряд учитывала только на одной валютной паре
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Crik1978, не работает потому, что для сделок на продажу есть нюансы при трале, не проходит по этому условию:

if (OrderStopLoss() >Ask+(TrailingStop+TrailingStep)*Point).

Пока первый StopLoss не установлен, нужно проводить сравнение с OrderOpenPrice, а уже потом можно сравнивать с OrderStopLoss . Можно в функции сделать разбивку на два условия, если OrderStopLoss() == 0 и OrderStopLoss() > 0.



А почему тогда на видеоуроке тралл происходит?
Еще вопрос: сравнение так должно выглядеть?:
if (OrderType()== OP_SELL)
{
if (OrderOpenPrice()-Ask>TrailingStop*Point)
{
if (OrderStopLoss()==0 )
{
SL=NormalizeDouble(OrderOpenPrice()+TrailingStop*Point,Digits);
}
if (OrderStopLoss() >0)
{
SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
if (OrderStopLoss()!=SL)
if (OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0))
{
Print("Модифицирован");
}
else Print ("не модифицирован");
}
}
}
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

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

По вашему примеру будет так:

Спойлер

if (OrderType()== OP_SELL)
{
if (OrderStopLoss() == 0)
{
if (OrderOpenPrice()-Ask>TrailingStop*Point)
{
if (OrderOpenPrice() >Ask+(TrailingStop+TrailingStep)*Point)
{
SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
if (OrderStopLoss()!=SL)
if (OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0))
{
Print("Модифицирован");
}
else Print ("не модифицирован");
}
}
}
if (OrderStopLoss() > 0)
{
if (OrderOpenPrice()-Ask>TrailingStop*Point)
{
if (OrderStopLoss() >Ask+(TrailingStop+TrailingStep)*Point)
{
SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
if (OrderStopLoss()!=SL)
if (OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0))
{
Print("Модифицирован");
}
else Print ("не модифицирован");
}
}
}
}



Получается просто стоп в расчёте не используется, пока у него нет значения отличного от ноля.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


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

По вашему примеру будет так:

Спойлер

if (OrderType()== OP_SELL)
{
if (OrderStopLoss() == 0)
{
if (OrderOpenPrice()-Ask>TrailingStop*Point)
{
if (OrderOpenPrice() >Ask+(TrailingStop+TrailingStep)*Point)
{
SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
if (OrderStopLoss()!=SL)
if (OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0))
{
Print("Модифицирован");
}
else Print ("не модифицирован");
}
}
}
if (OrderStopLoss() > 0)
{
if (OrderOpenPrice()-Ask>TrailingStop*Point)
{
if (OrderStopLoss() >Ask+(TrailingStop+TrailingStep)*Point)
{
SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
if (OrderStopLoss()!=SL)
if (OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0))
{
Print("Модифицирован");
}
else Print ("не модифицирован");
}
}
}
}



Получается просто стоп в расчёте не используется, пока у него нет значения отличного от ноля.


Спасибо. Еще вопрос, тралл происходит, но на графике при визуализации) не выставляется стопплосс. Почему?

Добавлено: 05-10-2014 20:21:46


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


Видеоурок с Вашего сайта "Изучаем MQL : Трейлинг-стоп"

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Честно говоря, не помню как было в уроке, но пересматривать не охота. Если хотите, то можете сами проверить, была ли там предварительная установка стопа, к тому же там иногда попадались ошибки в логике, намеренные и случайные, так что всё может быть.

На счёт отображения в режиме визуализации, в принципе должен отрисовываться, если программная установка есть. Почему не отображает, не знаю, возможно Метаквоты опять какой-нибудь глюк закинули в новые билды? У меня пока (670), но люди пишут, что вроде бы у некоторых уже (711) появился.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Crik1978 Вы формулируйте чётче. Не выставляется СЛ или не отрисовывается?
Если не выставляется, то что в журнале?
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Crik1978 Вы формулируйте чётче. Не выставляется СЛ или не отрисовывается?
Если не выставляется, то что в журнале?



В журнале выставляется СЛ, но на графике не отрисовывается.

Добавлено: 06-10-2014 15:15:28



Crik1978 Вы формулируйте чётче. Не выставляется СЛ или не отрисовывается?
Если не выставляется, то что в журнале?



В журнале выставляется СЛ, но на графике не отрисовывается.


Разобрался. Заработало.

Добавлено: 07-10-2014 08:30:41

Всем привет!
Подскажите, пжл, при осуществлении функции тралл советник тралит только по одному открытому ордеру (например: открыт ордер на продажу № 3, цена опустилась ниже на n-пунктов, советник открывает ордер на продажу № 4 и выставляет SL (на уровне Ask+TrailingStop*Point) только для ордера № 3, после срабатывания SL ордера № 3 советник выставляет SL для ордера № 4).
подскажите в чем может быть проблема? Как сделать что бы советник выставлял SL сразу для ордера № 3 и № 4? Изменено пользователем Crik1978
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Crik1978 Даже не знаю как Вам помочь. Вы-же сетку строите и если выставите СЛ для 3 ордера и цена пойдёт против него - какой же надо СЛ, чтоб его не выбило до открытия 4 ордера?
Обычно делают так (для сеток):
- пока наблюдаем убыток - СЛ не ставим: строим сеть.
- цена развернулась и вышла в 0 - ставим на все ордера СЛ от уровня БУ +- СЛ
- цена пошла в (+) - тралим.

А Вы хотите и СЛ на каждом ордере и сеть развивать - имхо криво получится.
Можно, конечно далёкий Стоп ставить, но смысл?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Crik1978 Даже не знаю как Вам помочь. Вы-же сетку строите и если выставите СЛ для 3 ордера и цена пойдёт против него - какой же надо СЛ, чтоб его не выбило до открытия 4 ордера?
Обычно делают так (для сеток):
- пока наблюдаем убыток - СЛ не ставим: строим сеть.
- цена развернулась и вышла в 0 - ставим на все ордера СЛ от уровня БУ +- СЛ
- цена пошла в (+) - тралим.

А Вы хотите и СЛ на каждом ордере и сеть развивать - имхо криво получится.
Можно, конечно далёкий Стоп ставить, но смысл?



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

Обучение языку MQL4 под MetaTrader 4 Опубликовано


в том то и дело, что хочется получить следующее: если поймали тренд (например медвежий), то открываем сделки Sell, которые траллим. Как только цена поднялась на trailingStоp, то закрыть все сделки кроме убыточной (последней сделки на Sell).

А... понял.
Надо код смотреть - косяк искать.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано



в том то и дело, что хочется получить следующее: если поймали тренд (например медвежий), то открываем сделки Sell, которые траллим. Как только цена поднялась на trailingStоp, то закрыть все сделки кроме убыточной (последней сделки на Sell).

А... понял.
Надо код смотреть - косяк искать.


вот код тралла:
void TrallSell ()
{
for (int i = 0; i {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType()== OP_SELL && CountBuy()==0 && CountSell()>0)
{
if (OrderStopLoss() == 0)
{
if (OrderOpenPrice()-Ask>TrailingStop*Point)
{
if (OrderOpenPrice() >Ask+TrailingStop*Point)
{
SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
if (OrderStopLoss()!=SL)
if (OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0))
{
Print("Модифицирован");
}
else Print ("не Модифицирован");
}
}
}
if (OrderStopLoss() > 0)
{
if (OrderOpenPrice()-Ask>TrailingStop*Point)
{
if (OrderStopLoss() >Ask+TrailingStop*Point)
{
SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
if (OrderStopLoss()!=SL)
if (OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0))
{
Print("Модифицирован");
}
else Print ("не Модифицирован");
}
}
if (CountSell()>0 && Ask {
if (OrderClose(OrderTicket(), OrderLots(), SL, Slippage, Red))
{
Print ("Ордер на продажу закрыт");
}
else Print ("Ордер на продажу не закрыт");
}
}
}
}
}
}
}
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


пытаюсь учить язык программирования

вот что написал

int start()
{

Comment("Привет");


return(0);
}

в тестере стратегий ничего не отображается...в чем причина?




В журнал Print на окно Comment
и не путай :) Изменено пользователем Pavel888
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Crik1978
Без обид - я шокирован... писать буду грубо - может поможет...

Вы в одну процедуру поместили несколько разных функций - это не правильно.
Вам в 1 очередь нужно навести порядок во всём коде эксперта - иначе ошибки не победить...
- внутрь цикла по всем ордерам включены функции внутри которых циклы по всем ордерам (Вы издеваетесь над МТ?)
- если у ордера нет СЛ его устанавливать (и проверять наличие) нужно например в CountSell()
- если неудачная попытка установить или модифицировать СЛ просто Принта не достаточно - надо выходить из трала
- ну и апофеоз: если цена идёт в нашу сторону т.е. для Селл: Ask Не соврал - до трала дело не дойдёт - есть ордер, чуть вышел в (+) - сразу закрываем.

зачем Вам CountSell()>0 здесь
if (CountSell()>0 && Askесли перед этим написано:
if (OrderType()== OP_SELL - ведь это значит, что Селл ордера есть!

Ваши ошибки от отсутствия плана и чёткого алгоритма в эксперте. Это не код, а помойка - в ней ковыряться противно. Прости за резкость.

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Crik1978
Без обид - я шокирован... писать буду грубо - может поможет...

Вы в одну процедуру поместили несколько разных функций - это не правильно.
Вам в 1 очередь нужно навести порядок во всём коде эксперта - иначе ошибки не победить...
- внутрь цикла по всем ордерам включены функции внутри которых циклы по всем ордерам (Вы издеваетесь над МТ?)
- если у ордера нет СЛ его устанавливать (и проверять наличие) нужно например в CountSell()
- если неудачная попытка установить или модифицировать СЛ просто Принта не достаточно - надо выходить из трала
- ну и апофеоз: если цена идёт в нашу сторону т.е. для Селл: Ask Не соврал - до трала дело не дойдёт - есть ордер, чуть вышел в (+) - сразу закрываем.

зачем Вам CountSell()>0 здесь
if (CountSell()>0 && Askесли перед этим написано:
if (OrderType()== OP_SELL - ведь это значит, что Селл ордера есть!

Ваши ошибки от отсутствия плана и чёткого алгоритма в эксперте. Это не код, а помойка - в ней ковыряться противно. Прости за резкость.



С каждым бывает в первый раз. Спасибо за прямоту. :-/

Добавлено: 07-10-2014 20:38:58



Crik1978
Без обид - я шокирован... писать буду грубо - может поможет...

Вы в одну процедуру поместили несколько разных функций - это не правильно.
Вам в 1 очередь нужно навести порядок во всём коде эксперта - иначе ошибки не победить...
- внутрь цикла по всем ордерам включены функции внутри которых циклы по всем ордерам (Вы издеваетесь над МТ?)
- если у ордера нет СЛ его устанавливать (и проверять наличие) нужно например в CountSell()
- если неудачная попытка установить или модифицировать СЛ просто Принта не достаточно - надо выходить из трала
- ну и апофеоз: если цена идёт в нашу сторону т.е. для Селл: Ask Не соврал - до трала дело не дойдёт - есть ордер, чуть вышел в (+) - сразу закрываем.

зачем Вам CountSell()>0 здесь
if (CountSell()>0 && Askесли перед этим написано:
if (OrderType()== OP_SELL - ведь это значит, что Селл ордера есть!

Ваши ошибки от отсутствия плана и чёткого алгоритма в эксперте. Это не код, а помойка - в ней ковыряться противно. Прости за резкость.



С каждым бывает в первый раз. Спасибо за прямоту. :-/



просто не могу понять, почему он тянет СЛ только первого ордера, а при срабатывании СЛ 1 ордера - выставляеи СЛ на 2 ордер и т.д. Изменено пользователем Crik1978
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Есть одна теория. Так как внутри цикла выбора ордеров есть еще один цикл с выбором ордеров то последней командой OrderSelect будет та что внутри вызываемой функции. Поэтому после условия проверки с вызовом внешней функции разместите еще одну проверку if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)). Скорее всего это решит проблему так как при работе с одним ордером в торговле он не может выбрать иной. А если в торговле уже 2 ордера то выбирается другой и поэтому такие функции как OrderOpenPrice и OrderStopLoss будут выдаваться не принадлежащие текущему ордеру.

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Crik1978
Ttomas абсолютно прав. Вам это пока даже сложно понять (имхо).
Говоря простым языком: с функциями типа CountBuy() (с перебором ордеров) нельзя играться. Их можно вызвать 1 раз вначале:
int cntB = CountBuy();
и далее в коде использовать "cntB".
Но это мелочи. Возьмите лист бумаги и рисуйте/пишите алгоритм работы бота. Начните примерно так:
1. Пришел тик. Что считаем/контролируем на каждом тике.
1.1. Подсчёт открытых ордеров (с контролем СЛ, подсчёт профита)
2. если есть открытые ордера.
2.3. Контроль сигнала на выход. Если ДА - закрываем и выходим
2.4. Контроль профита. Если ДА - трал.
3. Контроль сигнала на вход. Если ДА - открываем
4. Контроль закрытия бара.
4.1. Расчёт индикаторов. (если есть)
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Crik1978
Ttomas абсолютно прав. Вам это пока даже сложно понять (имхо).
Говоря простым языком: с функциями типа CountBuy() (с перебором ордеров) нельзя играться. Их можно вызвать 1 раз вначале:
int cntB = CountBuy();
и далее в коде использовать "cntB".
Но это мелочи. Возьмите лист бумаги и рисуйте/пишите алгоритм работы бота. Начните примерно так:
1. Пришел тик. Что считаем/контролируем на каждом тике.
1.1. Подсчёт открытых ордеров (с контролем СЛ, подсчёт профита)
2. если есть открытые ордера.
2.3. Контроль сигнала на выход. Если ДА - закрываем и выходим
2.4. Контроль профита. Если ДА - трал.
3. Контроль сигнала на вход. Если ДА - открываем
4. Контроль закрытия бара.
4.1. Расчёт индикаторов. (если есть)



Да и правда пока сложно. На ошибках учатся, прошу не судить строго.
С добавлением строки
int CnB=CountBuy();
все получилось.
Хотелось чтобы трейлинг происходил, когда ордеров на покупку нет.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


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


Помните я писал: 2.4. Контроль профита. Если ДА - трал.
В основной функции - вызывающей трал нужно делать доп.проверку. Опишем так:
2.5. Профит по Селл - ДА и Кол-во Бай ==0 -> Трал(Селл)
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано



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


Помните я писал: 2.4. Контроль профита. Если ДА - трал.
В основной функции - вызывающей трал нужно делать доп.проверку. Опишем так:
2.5. Профит по Селл - ДА и Кол-во Бай ==0 -> Трал(Селл)


Спасибо за комментарии. Помогло.

Подскажите еще на счет OrderSwap:
Если при подсчете общего профита
profit += OrderProfit()+OrderSwap();
(Например OrderSwap равно -5, а OrderProfit равно +10).
profit =10-5=5 - подсчет идет в таком выражении?

Если да, то при подстановке MathAbs следующее выражение будет верным????
profit += OrderProfit()+MathAbs(OrderSwap());
profit+=10+|-5|=10+5=15 - ЭТО ВЕРНО? В ТАКОМ ВИДЕ БУДЕТ ПРОИЗВОДИТЬ ВЫЧИСЛЕНИЯ СОВЕТНИК?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Crik1978 При подсчёте профита Своп должен вычитаться - он-же профит уменьшает! Зачем Вы хотите его суммировать с профитом? Если у Вас будет положительный Своп - тогда профит будет больше.
Ещё комиссию забыли - то-же профит отедает.
sum_PL += OrderProfit()+OrderCommission()+OrderSwap(); - это то, что на счёте останется после закрытия сделки.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Crik1978 При подсчёте профита Своп должен вычитаться - он-же профит уменьшает! Зачем Вы хотите его суммировать с профитом? Если у Вас будет положительный Своп - тогда профит будет больше.
Ещё комиссию забыли - то-же профит отедает.
sum_PL += OrderProfit()+OrderCommission()+OrderSwap(); - это то, что на счёте останется после закрытия сделки.



да формулу, то я понял. Я комиссию намеренно не беру в учет.
так если Orderswap будет с минусом, он уменьшит общий профит? Чтобы компенсировать отрицательный СВОП можно ли его сделать MathAbs(OrderSwap())??? Изменено пользователем Crik1978
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


так если Orderswap будет с минусом, он уменьшит общий профит? Чтобы компенсировать отрицательный СВОП можно ли его сделать MathAbs(OrderSwap())???

Да, отрицательный своп уменьшает профит.
Компенсируют обычно так: хотим заработать 15$ и закрыться - считаем профит с комис и свопом и когда получили 15 - закрываем (чистая прибыль в этот момент была больше, но она компенсировала своп и комиссию) Если Вы придумали другую логику - вперёд - ограничений нет... и, конечно, MathAbs(OrderSwap()) будет работать - куда ему деваться.
Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...