Только если цена поднялась вверх и ушла от текущего StopLoss на нужное количество пунктов:
if(Ask-CurrentStopLoss>stop*Point())
но так будет модификация чуть ли не на каждом тике - а это неправильно. Нужен ещё один параметр: шаг или по простому - зазор:
if(Ask-CurrentStopLoss-step*Point()>stop*Point())
Тестовый код, пытаюсь разгадать загадку трейлинг стопа.
Открываю 1 сделку, вроде логика трейлинга правильная, но на практике выходит какая то херота, никакого трейлинга не происходит, ничего не пойму. Кто поможет решить?
Запишите на бумаге чему равна цена Ask, чему равна цена CurrentStopLoss и затем разницу этих цен.
Затем ответьте на вопрос: "Когда разница этих цен будет больше значения stop"
И тогда наступит счастье.
Запишите на бумаге чему равна цена Ask, чему равна цена CurrentStopLoss и затем разницу этих цен.
Затем ответьте на вопрос: "Когда разница этих цен будет больше значения stop"
И тогда наступит счастье.
Будет больше когда Ask улетит вверх?
Только если цена поднялась вверх и ушла от текущего StopLoss на нужное количество пунктов:
но так будет модификация чуть ли не на каждом тике - а это неправильно. Нужен ещё один параметр: шаг или по простому - зазор:
Я не понимаю, изменил, но все равно ничего не трейлится
Я не понимаю, изменил, но все равно ничего не трейлится
Вы неправильно определяли тикет.
Пример полностью для неттинга:
//+------------------------------------------------------------------+ //| ProjectName | //| Copyright 2012, CompanyName | //| http://www.companyname.net | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #include <Trade\Trade.mqh> CTrade trade; int stop=500; int step=15; int take=0; int magicOrder=1101; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- double Ask=NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_ASK),Digits()); if(!PositionSelect(Symbol())) trade.Buy(0.01,Symbol(),Ask,Ask-stop*Point(),Ask+take*Point(),NULL); TrailingStop(Ask); } //+------------------------------------------------------------------+ void TrailingStop(double Ask) { if(PositionSelect(Symbol())) { ulong PositionTicket=PositionGetInteger(POSITION_TICKET); double CurrentStopLoss=PositionGetDouble(POSITION_SL); if(Ask-CurrentStopLoss-step*Point()>stop*Point()) trade.PositionModify(PositionTicket,(Ask-stop*Point()),0.0); } } //+------------------------------------------------------------------+
Вы неправильно определяли тикет.
Пример полностью для неттинга:
Да, работает, буду разбираться
Так неттинг это вроде когда много сделок сливаются в одну по усредненной цене, в таком случае как?
Я в условии вместо PositionSelect написал PositionsTotal()<2 но почему то он открывает кучу сделок и сливает в одну, соответственно стоп прыгает туда сюда
Да, работает, буду разбираться
Так неттинг это вроде когда много сделок сливаются в одну по усредненной цене, в таком случае как?
Я в условии вместо PositionSelect написал PositionsTotal()<2 но почему то он открывает кучу сделок и сливает в одну, соответственно стоп прыгает туда сюда
Неттинг: по одному символу может быть открыта ТОЛЬКО одна позиция.
Хедж: по одному символу может быть одновременно открыто НЕСКОЛЬКО позиций и при этом ОДНОГО или РАЗНОГО направления.
Все разобрался, благодарю за помощь
хеджирование в мт5 невозможно?
Почему это невозможно? Уже года два, как в MetaTrader 5 ввели поддержку хеджа.
Просто когда я увидел в Вашем коде
if(!PositionSelect(
я решил, что Вы используете неттинг (так как PositionSelect по имени символа применима только на неттинге).
Если Вам нужно обрабатывать хежд - тогда нужна другая логика: нужно обходить список всех позиций и в зависимости от типа позиции, от текущей цены модифицировать. И главное: сначала на бумажке напишите, А КАК ИМЕННО нужно модифицировать позиции - чтобы не получилось таких казусов, вроде:
if(MathAbs(CurrentStopLoss-Ask)>stop)
Будет больше когда Ask улетит вверх?
Я сегодня добрый, раз вам мама не позволяет писать на бумаге, я напишу для вас.
Согласно вашего кода
int stop=500;
double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
double CurrentStopLoss=PositionGetDouble(POSITION_SL);
Переменная Ask может принимать значения в зависимости от валюты, попробуем посчитать по EURUSD и позиция Buy
Текущая цена 1.22660, пусть будем считать что StopLoss поставлен на уровень 1.22160
Теперь считаем абсолютное значение разницы этих цен
if(MathAbs(CurrentStopLoss-Ask)>stop)
получаем 0.00500
ВОПРОС: При какой цене Ask абсолютная величина разницы этих цен будет больше 500 и будет-ли вообще???
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Тестовый код, пытаюсь разгадать загадку трейлинг стопа.
Открываю 1 сделку, вроде логика трейлинга правильная, но на практике выходит какая то херота, никакого трейлинга не происходит, ничего не пойму. Кто поможет решить?