Скачать MetaTrader 5

Функция переноса в бузубыток, учитывающая комиссию

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Dezil
955
Dezil  
Собственно сабж. Обычный перенос в безубыток дает убыток в итоге, т.к. существует комиссия брокера OrderCommission(). Есть у кого функция перноса в безубыток, учитывающая наличие комиссии брокера?
Artiom Morochin
301
Artiom Morochin  

Определи размер комиссии в пунктах

int  com_pip = MathCeil(OrderCommission() / (OrderLots()*MarketInfo(Symbol(),MODE_TICKVALUE)));

Вроде как-то так. потом или отнимаешь или добавляешь com_pip к цене открытия ордера. В зависимости от типа ордера

Dezil
955
Dezil  
Спасибо, проверю
Artiom Morochin
301
Artiom Morochin  
Dezil:
Спасибо, проверю
Всегда пожалуйста :)
Владимир Тезис
4267
Владимир Тезис  

Не забудьте встроить в программный код строку, которая проверяет тип торгового инструмента - ну просто чтоб не париться, чтоб советник сам отличал валютные пары от индексов, акций и т.п. сделать это можно вот так:

int Zalog=MarketInfo(Symbol(),MODE_MARGINCALCMODE);//Способ расчета залоговых средств. Возвращаемые значения: 0 - Forex; 1 - CFD; 2 - Futures; 3 - CFD на индексы 

Далее в коде проверяем что у нас лежит в переменной Zalog. Если ноль - то это валютная пара и перенос стопа в безубыток идёт по одному алгоритму. Если больше нуля, тот ам берут комиссию - применяем другой алгоритм
Dezil
955
Dezil  

Работает, но одно маленькое уточнение - т.к. размер комиссии величина отрицательная, то и возвращаемое значение будет отрицательным, т.ч. учтите это когда будете прибавлять или вычитать

Еще раз спасибо

Dezil
955
Dezil  
drknn:

Не забудьте встроить в программный код строку, которая проверяет тип торгового инструмента - ну просто чтоб не париться, чтоб советник сам отличал валютные пары от индексов, акций и т.п. сделать это можно вот так:

int Zalog=MarketInfo(Symbol(),MODE_MARGINCALCMODE);//Способ расчета залоговых средств. Возвращаемые значения: 0 - Forex; 1 - CFD; 2 - Futures; 3 - CFD на индексы

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


Комиссия бывает и на Forex парах - например NDD счета от Альпари
Владимир Тезис
4267
Владимир Тезис  
Dezil:
Комиссия бывает и на Forex парах - например NDD счета от Альпари

Надо же - я и не знал :)

Не имею дел со счетами Альпари. Не нравится мне что-то в ихнем пятизнаке. Когда-то открывал у них демо, ну на том дело и встало. 

Владимир Тезис
4267
Владимир Тезис  

Вот ещё что вспомнил и хотел бы рассказать.

Некоторые не-форекс торговые инструменты ходят не по одному пункту за тик. Поэтому при переносе стопа в безубыток нужно это учитывать. Скажем так. Евробакс ходит по одному пункту за тик. Если мы намерены переместить стоп в безубыток по достижении 30 пунктов профита, то тут проблем нет. Но вот скажем, индекс Dax в том же Broco ходит  как минимум по 5 пунктов за тик. Поэтому для Дакса наши 30 пунктов профита будут уже не 30, а 30*5. таким образом можно ввести понятие "шаг тика" или "размер тика". В коде я это прописывал в блоке инициализации советника следующим образом:

TickSize=MarketInfo(SMB,MODE_TICKSIZE);// размер тика (тип переменной - double)
PoSkolkoPunktov=TickSize/Point;// по сколько пунктов за тик ходит инструмент (тип переменной - int)
PoSkolkoPunktov=NormalizeDouble(PoSkolkoPunktov,0);

Далее в коде для определения уровня я уже использовал переменную PoSkolkoPunktov.

Владимир Тезис
4267
Владимир Тезис  
Чтоб не путаться в величинах шага тика я сделал скрипт, который выводит суммарную информацию по торговому инструменту на экран. Берите кому нужно - мне он не редко помогает.
Файлы:
all_info.rar 1 kb
Sergey Guliaev
2301
Sergey Guliaev  
Комиссия для разных объёмов сделок будет выражаться одинаковым количеством пунктов или нужно считать для каждого ордера отдельно?
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий