Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1154

 
KhuKhu:

Привет, друзья.

Как сделать, чтобы значения стоплоса, текпрофита и трейлинга выдавалось не в пунктах, а процентах. 

Вот такая формула сильно загромождает и совсем не работает

StopLoss=NormalizeDouble(Bid-(Bid-TrailingStop)/100*TRAL_PERCENT,Digits);

Хотелось бы простейший вид процента.

Double Stoploss = 0.05;

--------

Profit=Bid-Stoploss в процентах (пример корявый, но так для понимания)

Спасибо. 

Корявый пример порождает корявый ответ. Для понимания надо понять от чего мерить проценты???

 
Андрей Касторский:
.. Кому нужна помощь в написании советника, можете писать  мне . Помогу

помогите взять цену с нулевого бара, вот здесь обсуждение

https://www.mql5.com/ru/forum/160683/page237#comment_5350688

 
Alexey Viktorov:

Корявый пример порождает корявый ответ. Для понимания надо понять от чего мерить проценты???

Понял.

Попытаюсь яснее.

Изначально у меня код выглядит так:

extern double StopLoss   =0;     

extern double TakeProfit   =0; 

extern double  SL_PERCENT = 0.02;

extern double  TP_PERCENT = 0.03;

extern double  TRALL_PERCENT = 0.01;

extern double Lots       =0.5;


Ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,NormalizeDouble(OrderOpenPrice+(OrderOpenPrice + StopLoss)/100*SL_PERCENT,Digits),NormalizeDouble(OrderOpenPrice-(OrderOpenPrice - TakeProfit)/100*TP_PERCENT,Digits),"",Magic,0,Red);

StopLoss срабатывает, но не на 0.02%, а на 0.43%, что не корректно. TakeProfit не знаю, т.к. не довелось, но видимо тоже будет некорректно. 

Есть у меня предположения, что код не верен.

Да и еще, может это важно. Ордера отркрываются на все депо пачкой на 3-4 пары. Иногда на пять. 


Также я  хочу для таких показателей, как: StopLoss, Takeprofit, TrailingStop задавать изменение не в пунктах, а в процентах.

Например,

1)Takeprofit=ОrderOpenPrice+%TP_PERCENT

2) Stoploss=ОrderOpenPrice-%SL_PERCENT

Т.е. 

ticket=OrderSend(Symbol(),OP_BUY,1,Ask,0,%,%,"",Magic,0,clrGreen);


И вот как дальше модифицировать для трейлинга вообще не соображу. 

Я взял образец из учебника, но что-то явно делаю не так. 

3.) TrailingStop=Bid-%TRALL_PERCENT

case 0:               // Ордер Buy

                  if (NormalizeDouble(OrderOpenPrice-SL*Point,Digits)*SL_PERCENT/100<=(OrderOpenPrice-Ask) // Если ниже желаем.

                      NormalizeDouble(Bid-(Bid-TS)/100*TRAL_PERCENT,Digits)

                     || NormalizeDouble(SL,Digits)==0)

                  

                     

                    {

                     SL=Bid-TS*Point;           // то модифицируем его

                     string Text="Buy ";        // Текст для Buy 

                     Modify=true;               // Назначен к модифи.

                    }


Я очень надеюсь, что смог объяснить.

Спасибо.

 

Как грамотно реализовать открытие сделки (отправки OrderSend) строго на начале свечи - OnTimer и/или OnTick,

дабы не сильно нагружать терминал (открыто и отслеживается одновременно 20-30 графиков)?

обнаружилось что задержка при появлении нового тика в начале свечи может быть до 5-10 сек при этом разрыв с предыдущим тиком значительный (негативно для условий сделки)

p.s. при этом в эксперте предполагается предварительно уведомлять о возможной сделке за 1-2 минуты до открытия сделки, т.е. до начала открытия свечи.

 
maxsoft:

Как грамотно реализовать открытие сделки (отправки OrderSend) строго на начале свечи - OnTimer и/или OnTick,

дабы не сильно нагружать терминал (открыто и отслеживается одновременно 20-30 графиков)?

обнаружилось что задержка при появлении нового тика в начале свечи может быть до 5-10 сек при этом разрыв с предыдущим тиком значительный (негативно для условий сделки)

p.s. при этом в эксперте предполагается предварительно уведомлять о возможной сделке за 1-2 минуты до открытия сделки, т.е. до начала открытия свечи.

Вам нужно в таймере просматривать все открытые графики на предмет появления нового бара.

Придётся создавать массив указателей на экземпляры классов - по одному классу на каждый таймфрейм каждого открытого графика.

Про класс, отслеживающий открытие нового бара, можете почитать в этой статье.

Открываете график - добавляете его в массив открытых графиков. Закрываете график - удаляете его из массива.

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

 
Artyom Trishkin:

Вам нужно в таймере просматривать все открытые графики на предмет появления нового бара.

Придётся создавать массив указателей на экземпляры классов ...

а средствами MQL4?

и как быть  с  - "...предполагается предварительно уведомлять о возможной сделке за 1-2 минуты до открытия сделки, т.е. до начала открытия свечи...", т.е. внутри бара

 

Приглашаю в тему https://www.mql5.com/ru/forum/208120#comment_5412193

Не можем найти консенсус.

Играем в блиц ЧТО? ГДЕ? КОГДА? 3 вопроса по 20 секунд
Играем в блиц ЧТО? ГДЕ? КОГДА? 3 вопроса по 20 секунд
  • 2017.07.07
  • www.mql5.com
Народ, подскажите пожалуйста, заморочился я тут по поводу AccountBalance() и AccountLeverage(). 1...
 

Перед выводом на экран типа doubl делаю его нормализацию до 2-х знаков после запятой, но иногда она не срабатывает. Почему? Вот часть кода.

prof[num]=(string)NormalizeDouble((double)prof[num]+(double)profit2,2);

Тип prof[] - string

А глючит так


 
Vladimir Tkach:

Перед выводом на экран типа doubl делаю его нормализацию до 2-х знаков после запятой, но иногда она не срабатывает. Почему? Вот часть кода.

Тип prof[] - string

А глючит так


DoubleToString()

DoubleToString

Преобразование числового значения в текстовую строку.

string  DoubleToString(
   double  value,      // число
   int     digits=8    // кол-во знаков после запятой
   );

Параметры

value

[in]  Величина с плавающей точкой.

digits

[in]  Формат точности. Если значение digits лежит в диапазоне от 0 до 16, то будет получено строковое представление числа с указанным количество знаков после запятой. Если значение digits лежит в диапазоне от -1 до -16, то будет получено строковое представление числа в научном формате с указанным количеством знаков после запятой. Во всех остальных случаях строковое представление числа будет содержать 8 знаков после запятой.

Возвращаемое значение

Строка, содержащая символьное представление числа в указанном формате точности.

Пример:

   Print("DoubleToString(120.0+M_PI) : ",DoubleToString(120.0+M_PI));
   Print("DoubleToString(120.0+M_PI,16) : ",DoubleToString(120.0+M_PI,16));
   Print("DoubleToString(120.0+M_PI,-16) : ",DoubleToString(120.0+M_PI,-16));
   Print("DoubleToString(120.0+M_PI,-1) : ",DoubleToString(120.0+M_PI,-1));
   Print("DoubleToString(120.0+M_PI,-20) : ",DoubleToString(120.0+M_PI,-20));

 

Какой-то дивный баг что ли.

Добавляем во входных:

input datetime test                                =0;

Компилируем. При нулевой дате 1970.01.01 в настройках невозможно поставить час 00, 01 или 02.