[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 419

 

Forexman77:
Как сделать, чтобы программа выдавала уровень ЕМА в качестве цены? Допустим ЕМА1 с периодом (1), ЕМА2 с периодом (0), ЕМА1 равняется 1.3321, а ЕМА2 на текущий период 1.3200. Необходимо, чтобы результат выражения (ЕМА1-ЕМА2) равнялся 0,0121. При запуске скрипта для проверки алерт показывает значение ноль, а надо чтобы "0,0121". Как решить эту задачу?

double delta = iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,0) - iMA(NULL,0,0,0,MODE_EMA,PRICE_CLOSE,0);

if (delta == 0.0121) Alert("Delta=0.0121"); 
 
Forexman77:
Как сделать, чтобы программа выдавала уровень ЕМА в качестве цены? Допустим ЕМА1 с периодом (1), ЕМА2 с периодом (0), ЕМА1 равняется 1.3321, а ЕМА2 на текущий период 1.3200. Необходимо, чтобы результат выражения (ЕМА1-ЕМА2) равнялся 0,0121. При запуске скрипта для проверки алерт показывает значение ноль, а надо чтобы "0,0121". Как решить эту задачу?

А сам скрипт увидеть возможно? - Предположительно у Вас либо не тот тип данных используется для получения, например интеджер вместо дабл (поэтому округляется до нуля), либо еще что-то, что приводит к нулевому значению: без кода понять сложно.

Кстати, если Вы скриптом проверяете то, что до этого написали, то ошибка может быть как в самом скрипте (предположительно написанным именно для проверки своего индикатора), либо в коде самого индикатора.

 
TarasBY:
Если правильно написана фильтрация своих ордеров, которую я Вам предложил написать и Вы учитываете в своих расчётах комиссию и свопы, то всё работает правильно.


вы дали видимо очень сложный путь.

у меня ничего не получается. 


я тупо вставил в ваш образец следующее:

ld_Profit = fGet_ProfitLastCloseOrd (12);    
Print (ld_Profit);

  Он выдает какую-то цифру, но она далека от реальности.

не могли бы вы для особо тупых ПОКАЗАТЬ, где мне надо ввести число 12 чтобы все работало. Ибо про "фильтрацию ордеров" я вообще не в курсе.... 

 
lottamer:


вы дали видимо очень сложный путь.

у меня ничего не получается. 


я тупо вставил в ваш образец следующее:

  Он выдает какую-то цифру, но она далека от реальности.

не могли бы вы для особо тупых ПОКАЗАТЬ, где мне надо ввести число 12 чтобы все работало. Ибо про "фильтрацию ордеров" я вообще не в курсе.... 

Для полного контроля работы функции все промежуточные расчёты вывел на чарт.

Осталось только за Вас написать код.

Есть два пути: или самому разобраться (причём, на примерах - я Вам дал рабочий скрипт), или искать того, кто всё сделает за Вас.

P.S. Если вдруг будет желание разобраться, то начинать можно отсюда.

 
Chiripaha:

А сам скрипт увидеть возможно? - Предположительно у Вас либо не тот тип данных используется для получения, например интеджер вместо дабл (поэтому округляется до нуля), либо еще что-то, что приводит к нулевому значению: без кода понять сложно.

Кстати, если Вы скриптом проверяете то, что до этого написали, то ошибка может быть как в самом скрипте (предположительно написанным именно для проверки своего индикатора), либо в коде самого индикатора.


 Вы правы, убрал ЕМА c int на double и все стало, как надо.
 
TarasBY:

Для полного контроля работы функции все промежуточные расчёты вывел на чарт.

Осталось только за Вас написать код.

Есть два пути: или самому разобраться (причём, на примерах - я Вам дал рабочий скрипт), или искать того, кто всё сделает за Вас.

P.S. Если вдруг будет желание разобраться, то начинать можно отсюда.


спасибо, обязательно попробую разобраться
 
Forexman77:
Как сделать, чтобы программа выдавала уровень ЕМА в качестве цены? Допустим ЕМА1 с периодом (1), ЕМА2 с периодом (0), ЕМА1 равняется 1.3321, а ЕМА2 на текущий период 1.3200. Необходимо, чтобы результат выражения (ЕМА1-ЕМА2) равнялся 0,0121. При запуске скрипта для проверки алерт показывает значение ноль, а надо чтобы "0,0121". Как решить эту задачу?

Использовать в расчётах переменные типа double, а не int;

использовать нормализацию при расчёте результата выражения NormalizeDouble(число1-число2, нужная точность);

использовать для вывода результата на экран (в журнал) DoubleToStr(полученный результат, нужная точность);

Больше без вашего кода подсказать нечего...

 
Forexman77:
 Вы правы, убрал ЕМА c int на double и все стало, как надо.

Вот, уже нашли... Всё-равно, учтите, что, во избежание скрытых ошибок и неточностей, используйте нормализацию при сравнении и вычислении данных, имеющих тип double
 
Chiripaha:

Суть в чем: Конечно, можно ради интереса попросить Вас более детально описать условия, поскольку Вы предоставили лишь общее описание: когда были установлены роботом отложки (заранее или нет; ручные примерно одинаково с роботом по времени или нет и т.п.). Но все равно Вам и в этом случае придется разбираться только с брокером, т.к. у него свой поток, который, вероятно, выстраивает очередь исполнения сделок. И предположим, если в Вашей очереди стояла ручная отложка первой, то время исполнения у отложек будет разным (включая очередь других клиентов), стало быть и цена может быть тоже разной. А если робот ставил отложки в период формировавшихся сигналов, то попадание в очередь опять же не очевидно - отсюда возможны смещения по цене исполнения. Так же может влиять размер позиций, о которых вы ничего не пишите... и т.п...

Но... все равно это лишь с брокером (ДЦ) можно выяснить. И, предполагаю, что он найдет кучу причин, которые я не упомянул. - И совет был верным: лог в руки и к брокеру, если, конечно, Вы до сих пор считаете, что ваши заявки отложенных ордеров переместились. Но только не стоит путать 2 разных понятия: Отложенный Ордер и Сделка по этому Отложенному Ордеру. Отложенный Ордер - это распоряжение - войти в рынок по любой ближайшей цене заявленным объемом. А Сделка - это та цена, по которой удалось исполнить Ваше распоряжение на заявленный объем денег (лота). - И цены у этих ордеров скорее всего (особенно на быстром рынке - на что Вам и дали ссылку) будут отличаться. У лимитных ордеров - цена заявки и цена исполнения равны (по определению).

А то, что у брокера и демо и реал не отличаются - это же хорошо! - Это говорит о том, что брокер не занимается подтасовыванием сделок, чтобы привлечь клиентов (с Ваших слов). - Разногласий не видно в данном случае.


Спасибо за столь развёрнутый ответ, стало всё понятно что к чему. Если использовать систему исполнения ордеров Instant Execution, эта проблема решится?

Что до тех условий которые я не рассказал:

Робот выставил отложки раньше, чем выставленные в ручную, но они модифицировались до новости.

Обём сделок был одинаков, расстояния примерно те же

в общем условия были почти полностью схожи 

 
TarasBY:
Текущий день начинается с начала текущего D1 бара (iTime (NULL, PERIOD_D1, 0)), НО Вы же не ищите лёгких путей?! :)))


тут вот какая проблемка всплыла.

все работает, но только ОДИН раз. Т.е. если ставлю период (iTime (NULL, PERIOD_D1, 0)) дневки, то на следующей дневке она уже не работает.

 

написал тестовый код для проверки

 

GetProfitFromDateInCurrency (Symbol(), -1, -1, iTime (NULL, PERIOD_M1, 0));  

if  (GetProfitFromDateInCurrency()<1 && GetProfitFromDateInCurrency()>-1)
    { My_buy ();  My_close(); }
поставил период МИНУТКИ, так чтобы за минуту слить доллар на спреде и остановиться, ДО НАЧАЛА ВТОРОЙ МИНУТЫ. И он льет и останавливается. А вот почему на второй минуте он не открывает сделок? 
Причина обращения: