[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 793

 
artmedia70:
А разве Buy мы открываем не по Ask ???????


я ж это и написал: "ордера на покупку открываются по цене Ask".

Но на графике вы видите цену Bid.

 
PapaYozh:


я ж это и написал: "ордера на покупку открываются по цене Ask".

Но на графике вы видите цену Bid.

У меня на графике обе цены всегда... В настройках терминала по F8 включил отображение Ask`ов... Да и подправил малость предыдущий пост по поводу спреда - такого быть не может.
 
artmedia70:
А разве Buy мы открываем не по Ask ??????? Да и не может быть спреда в 60 пунктов (это если брать после гэпа), а если до ..., то спред на евре в 325 пп - жесть ... :)

на Вашей картинке не видны пункты.
 
PapaYozh:

на Вашей картинке не видны пункты.
Да, каюсь ... это может ввести в заблуждение (как и скобочки в вашем посте, где из-за них я потерял смысл вашего ответа по поводу асков и ответил невпопад... :) )
 
artmedia70:
У меня на графике обе цены всегда... В настройках терминала по F8 включил отображение Ask`ов... Да и подправил малость предыдущий пост по поводу спреда - такого быть не может.


Но в барах цена Ask не видна.

По поводу спреда. Это пятизнак? Если "да", то расширенный на новостях спред + проскальзывание = вот Вам и 6 полновесных (60 пятизначных) пунктов

 
PapaYozh:


Но в барах цена Ask не видна.

По поводу спреда. Это пятизнак? Если "да", то расширенный на новостях спред + проскальзывание = вот Вам и 6 полновесных (60 пятизначных) пунктов

В том-то и дело, что четырёх- ... :(
 
PapaYozh:

Если я правильно понял Вашу проблему, то Вам не надо ориентироваться на время закрытия ордера. Вам надо отталкиваться от времени начала того бара, на котором появился сигнал на открытие и была открыта позиция. Лично я поступил бы следующим образом:

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 bar
   if(Volume[0]>1) return;
//---- get Moving Average 
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
   if(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 conditions
   if(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 бар, это будет совершенно тоже самое, не логично разве?
 
PapaYozh:


Но в барах цена Ask не видна.

По поводу спреда. Это пятизнак? Если "да", то расширенный на новостях спред + проскальзывание = вот Вам и 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

Помогите разобраться, что тут к чему и где же, блин, собака порылась... :)


Причина обращения: