я ж это и написал: "ордера на покупку открываются по цене Ask".
Но на графике вы видите цену Bid.
У меня на графике обе цены всегда... В настройках терминала по F8 включил отображение Ask`ов... Да и подправил малость предыдущий пост по поводу спреда - такого быть не может.
artmedia70: А разве Buy мы открываем не по Ask ??????? Да и не может быть спреда в 60 пунктов (это если брать после гэпа), а если до ..., то спред на евре в 325 пп - жесть ... :)
Да, каюсь ... это может ввести в заблуждение (как и скобочки в вашем посте, где из-за них я потерял смысл вашего ответа по поводу асков и ответил невпопад... :) )
artmedia70: У меня на графике обе цены всегда... В настройках терминала по F8 включил отображение Ask`ов... Да и подправил малость предыдущий пост по поводу спреда - такого быть не может.
Но в барах цена Ask не видна.
По поводу спреда. Это пятизнак? Если "да", то расширенный на новостях спред + проскальзывание = вот Вам и 6 полновесных (60 пятизначных) пунктов
Если я правильно понял Вашу проблему, то Вам не надо ориентироваться на время закрытия ордера. Вам надо отталкиваться от времени начала того бара, на котором появился сигнал на открытие и была открыта позиция. Лично я поступил бы следующим образом:
1) завёл бы переменную типа datetime, куда заносил бы значение Time[0] при удачном выставлении ордера;
2) в функции init() проинициализировал бы эту переменную значением "0", я предпочитаю явную инициализацию, т.к. это более наглядно при просмотре кода;
3) при появлении условий для открытия позиции, прежде чем отправлять запрос OrderSend(...), сравнил бы значение той самой преременной со значением Time[0] и, если они не равны, то отправил бы запрос.
4) если позиция открылась, то запомнил бы значение Time[0] в ту самую переменную.
Спасибо за разъяснение - а как Вы считаете, нельзя ли вместо сравнения со значением Time[0] попробовать дать такое задание перед запросом OrderSend(...) : проверить, есть ли на текущем баре закрытие по StopLoss-y? Тогда нужно вводить функцию duble StopLoss(), которая будет работать с объявленной мною переменной StopLoss? Или это все-таки принципиально НЕ ВОЗМОЖНО? Мне важно, чтобы на баре, на котором поймали лося, новая позиция не открывалась, даже если по параметрам он подходит под открытие.
extern double Stoploss =1000;
//+------------------------------------------------------------------+//| Check for open order conditions |//+------------------------------------------------------------------+void CheckForOpen()
{
double ma;
int res;
//---- go trading only for first tiks of new barif(Volume[0]>1) return;
//---- get Moving Average
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditionsif(Open[1]>ma && Close[1]<ma)
{
res=OrderSend(Symbol(),OP_SELL,Lots,Bid,30,Bid+Stoploss*Point,Bid-Takeprofit*Point,"",MAGICMA,0,Red);
return;
}
//---- buy conditionsif(Open[1]<ma && Close[1]>ma)
{
res=OrderSend(Symbol(),OP_BUY,Lots,Ask,30,Ask-Stoploss*Point,Ask+Takeprofit*Point,"",MAGICMA,0,Blue);
return;
}
//----
}
Дело в том, что ко временнЫм факторам хотелось бы обратиться в последнюю очередь - очень часто проскальзывают - вернее интерпретация приказа почему-то получается разнородной (неоднозначной)
obla4ko, создайте переменную типа datetime x, и пусть это будет время открытие бара, на котором произошел стоплосс. А в условии открытия поставте, что (Time[0]!=x). При этом x должно обновляться при новом сработавшем стоплосе. Это первый вариант. И второй как я уже в третий раз пишу, после срабатывания стопа включить ожидание 1 бар, это будет совершенно тоже самое, не логично разве?
По поводу спреда. Это пятизнак? Если "да", то расширенный на новостях спред + проскальзывание = вот Вам и 6 полновесных (60 пятизначных) пунктов
также, по-моему, возможна "шпилька", в дальнейшем подчищенная..:)), но "сохраненная в памяти" более мелких таймфреймов, до которых уже не добраться...
а по поводу тестирования на истории вопрос :
может ли советник (простенький!:)) - не сетка) на одной и том же отрезке истории,с одними и теми же параметрами давать совершенно различные результаты?
Единственное что, я, между этими двумя тестированиями, обновила архив котировок... и это могло привести к такому результату!? - тогда получается, что вся история - это фигня!?
Подскажите кто-нибудь, почему MathRound() как-то странно себя ведёт. Большие величины считает, маленькие - нет...
Есть простой код увеличения значения некоторых переменных на 10 процентов:
if (IncreaseTP)
{
LastTakeProfitS = MathRound(LastTakeProfitS+LastTakeProfitS/100*PercentTakePr); // PercentTakePr = 10; (десять процентов) эту строку считает
TStartS = MathRound(TStartS+TStartS/10*PercentTakePr); // а вот эту и все, которые ниже - нет
TStop.Sell = MathRound(TStop.Sell+TStop.Sell/10*PercentTakePr); // ... причём, если деление на 100 заменить на деление на 10,
TStartLastPosS = MathRound(TStartLastPosS+TStartLastPosS/10*PercentTakePr); // ... то начинает считать и эти строки, но уже, естественно...if (TStop.SellLP<=Level_new+spread) TStop.SellLP=Level_new+spread; // ... рассчёт становится неверным...
}
В журнал выводятся рассчитываемые величины. Вот это считается при делении на 10 всех строк, кроме первой (в ней деление на 100 и считает без проблем):
2010.08.11 19:16:20 2009.01.02 10:34 Sergitas_v1.01 EURUSD,M5: Function of calculation: SLs = 11 and TPs = 66, TStartS = 60, TStop.Sell = 20, TStartLastPosS = 60, TStop.SellLP = 25
Зелёным отмечено то, что в первой строке кода считается.
А вот если поставить деление на 100 (как и должно быть)
if (IncreaseTP)
{
LastTakeProfitS = MathRound(LastTakeProfitS+LastTakeProfitS/100*PercentTakePr); // PercentTakePr = 10; (десять процентов) эту строку считает
TStartS = MathRound(TStartS+TStartS/100*PercentTakePr); // а вот эту и все, которые ниже - нет
TStop.Sell = MathRound(TStop.Sell+TStop.Sell/100*PercentTakePr); // ... причём, если деление на 100 заменить на деление на 10,
TStartLastPosS = MathRound(TStartLastPosS+TStartLastPosS/100*PercentTakePr); // ... то начинает считать и эти строки, но уже, естественно...if (TStop.SellLP<=Level_new+spread) TStop.SellLP=Level_new+spread; // ... рассчёт становится неверным...
}
... то все строки, кроме верхней вообще не считаются - остаются изначально заданные величины, как-будто и не прибавлялось
к ним десять процентов:
2010.08.11 19:41:03 2009.01.02 10:34 Sergitas_v1.01 EURUSD,M5: Function of calculation: SLs = 11 and TPs = 66, TStartS = 30, TStop.Sell = 10, TStartLastPosS = 30, TStop.SellLP = 15
Помогите разобраться, что тут к чему и где же, блин, собака порылась... :)
А разве Buy мы открываем не по Ask ???????
я ж это и написал: "ордера на покупку открываются по цене Ask".
Но на графике вы видите цену Bid.
я ж это и написал: "ордера на покупку открываются по цене Ask".
Но на графике вы видите цену Bid.
А разве Buy мы открываем не по Ask ??????? Да и не может быть спреда в 60 пунктов (это если брать после гэпа), а если до ..., то спред на евре в 325 пп - жесть ... :)
на Вашей картинке не видны пункты.
на Вашей картинке не видны пункты.
У меня на графике обе цены всегда... В настройках терминала по F8 включил отображение Ask`ов... Да и подправил малость предыдущий пост по поводу спреда - такого быть не может.
Но в барах цена Ask не видна.
По поводу спреда. Это пятизнак? Если "да", то расширенный на новостях спред + проскальзывание = вот Вам и 6 полновесных (60 пятизначных) пунктов
Но в барах цена Ask не видна.
По поводу спреда. Это пятизнак? Если "да", то расширенный на новостях спред + проскальзывание = вот Вам и 6 полновесных (60 пятизначных) пунктов
Если я правильно понял Вашу проблему, то Вам не надо ориентироваться на время закрытия ордера. Вам надо отталкиваться от времени начала того бара, на котором появился сигнал на открытие и была открыта позиция. Лично я поступил бы следующим образом:
1) завёл бы переменную типа datetime, куда заносил бы значение Time[0] при удачном выставлении ордера;
2) в функции init() проинициализировал бы эту переменную значением "0", я предпочитаю явную инициализацию, т.к. это более наглядно при просмотре кода;
3) при появлении условий для открытия позиции, прежде чем отправлять запрос OrderSend(...), сравнил бы значение той самой преременной со значением Time[0] и, если они не равны, то отправил бы запрос.
4) если позиция открылась, то запомнил бы значение Time[0] в ту самую переменную.
Спасибо за разъяснение - а как Вы считаете, нельзя ли вместо сравнения со значением Time[0] попробовать дать такое задание перед запросом OrderSend(...) : проверить, есть ли на текущем баре закрытие по StopLoss-y? Тогда нужно вводить функцию duble StopLoss(), которая будет работать с объявленной мною переменной StopLoss? Или это все-таки принципиально НЕ ВОЗМОЖНО? Мне важно, чтобы на баре, на котором поймали лося, новая позиция не открывалась, даже если по параметрам он подходит под открытие.
extern double Stoploss =1000;Дело в том, что ко временнЫм факторам хотелось бы обратиться в последнюю очередь - очень часто проскальзывают - вернее интерпретация приказа почему-то получается разнородной (неоднозначной)
Но в барах цена Ask не видна.
По поводу спреда. Это пятизнак? Если "да", то расширенный на новостях спред + проскальзывание = вот Вам и 6 полновесных (60 пятизначных) пунктов
также, по-моему, возможна "шпилька", в дальнейшем подчищенная..:)), но "сохраненная в памяти" более мелких таймфреймов, до которых уже не добраться...
а по поводу тестирования на истории вопрос :
может ли советник (простенький!:)) - не сетка) на одной и том же отрезке истории,с одними и теми же параметрами давать совершенно различные результаты?
Единственное что, я, между этими двумя тестированиями, обновила архив котировок... и это могло привести к такому результату!? - тогда получается, что вся история - это фигня!?
Подскажите кто-нибудь, почему MathRound() как-то странно себя ведёт. Большие величины считает, маленькие - нет...
Есть простой код увеличения значения некоторых переменных на 10 процентов:
В журнал выводятся рассчитываемые величины. Вот это считается при делении на 10 всех строк, кроме первой (в ней деление на 100 и считает без проблем):
2010.08.11 19:16:20 2009.01.02 10:34 Sergitas_v1.01 EURUSD,M5: Function of calculation: SLs = 11 and TPs = 66, TStartS = 60, TStop.Sell = 20, TStartLastPosS = 60, TStop.SellLP = 25
Зелёным отмечено то, что в первой строке кода считается.
А вот если поставить деление на 100 (как и должно быть)
... то все строки, кроме верхней вообще не считаются - остаются изначально заданные величины, как-будто и не прибавлялось
к ним десять процентов:
2010.08.11 19:41:03 2009.01.02 10:34 Sergitas_v1.01 EURUSD,M5: Function of calculation: SLs = 11 and TPs = 66, TStartS = 30, TStop.Sell = 10, TStartLastPosS = 30, TStop.SellLP = 15
Помогите разобраться, что тут к чему и где же, блин, собака порылась... :)