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

 
Roger:

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


Пусть наши понятия о терминах не совпадают, но вы же поняли меня?

Проблему решил, она была здесь:

double getLots(double newSL) {
   int opnTime = 0; // время открытия трейда для цикла пересчета позиций
   double lotSum = 0; 
   for (int i = 0; i <= OrdersTotal()-1; i++) {
      OrderSelect(i, SELECT_BY_POS);     
      if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) { 
         opnTime = OrderOpenTime(); 
         if (OrderType() == OP_BUY)    { lotSum += OrderLots() * (newSL - OrderOpenPrice()) / Point; }
         if (OrderType() == OP_SELL)   { lotSum -= OrderLots() * (newSL - OrderOpenPrice()) / Point; }
      }
   }   
   return(lotSum);
}

В этой функции не учитывались все открытые трейды, пришлось менять условия цикла. Теперь она имеет такой вид:

double AcountProfitEx(double Price) {
   double   ProfitSum   = 0;
   for (int i = OrdersTotal()-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS);
      if(OrderType() == OP_BUY)
      ProfitSum -= (OrderOpenPrice() - Price) * OrderLots() / Point;
      if(OrderType() == OP_SELL)
      ProfitSum += (OrderOpenPrice() - Price) * OrderLots() / Point;
   }
   return (ProfitSum);
}

Эта функция рассчитывает сумму прибыли от всех открытых трейдов в указанном ей уровне цены. Однако есть котируемое мнение, что в ней не учтен спред, с чем я соглашаюсь. Автор этого мнения предложил такое решение:

double getLots(double newSL)
{
   double TickValue, delta;
   double lotSum;
   string SymbolName;
   
   SymbolName = Symbol();
   TickValue = MarketInfo( SymbolName, MODE_TICKVALUE) / Point;
   delta = ( newSL - Bid ) * TickValue;

   lotSum = 0.0; 
   for (int i = 0; i <= OrdersTotal()-1; i++)
   {
      OrderSelect(i, SELECT_BY_POS);     
      if ( OrderSymbol() == SymbolName )
      { 
         if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * delta; }
         if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * delta; }
      }
   }   
   return(lotSum);
}

Но, признаюсь честно, я его не понимаю, как пишет он:

Не учтен спред. Это можно исправить, считая результат от текущей цены.
Что-то я не понимаю алгоритма, который он предложил, каким же образом там учитывается спред? Может кто-нибудь объяснить?
 
Mepkypuu:

Но, признаюсь честно, я его не понимаю, как пишет он:

Что-то я не понимаю алгоритма, который он предложил, каким же образом там учитывается спред? Может кто-нибудь объяснить?

OrderProfit() считается для коротких позиций по текущему Ask, вот здесь и учитываются значения текущего спреда. Если спред не изменится, то, при изменении цены от величины текущего Bid до newSL профит позиции ( любой, Buy или Sell, с соответствующим знаком ) в один лот изменится на величину delta, что и записано в операторе:

delta = ( newSL - Bid ) * TickValue;

Короче, OrderProfit() считает все с учетом спредов.Фиксируем, с помощью OrderProfit(), результат на определенный момент ( текущая цена). Дальше, нам остается лишь следить за изменением цены.

 
Mislaid:

OrderProfit() считается для коротких позиций по текущему Ask, вот здесь и учитываются значения текущего спреда. Если спред не изменится, то, при изменении цены от величины текущего Bid до newSL профит позиции ( любой, Buy или Sell, с соответствующим знаком ) в один лот изменится на величину delta, что и записано в операторе:

delta = ( newSL - Bid ) * TickValue;

Короче, OrderProfit() считает все с учетом спредов.Фиксируем, с помощью OrderProfit(), результат на определенный момент ( текущая цена). Дальше, нам остается лишь следить за изменением цены.

Кажется начинаю понимать, только, наверное, правильнее так:

if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * ((newSL - Bid) / Point * MarketInfo( SymbolName, MODE_TICKVALUE)); }
if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * ((newSL - Ask) / Point * MarketInfo( SymbolName, MODE_TICKVALUE)); }

Ведь OrderProfit для коротких позиций считается от цены Ask, не так ли?

Кстати MarketInfo( SymbolName, MODE_TICKVALUE) у меня дает 329.02 на паре EURUSD валюта депозита USD, поэтому у меня не считает эта функция все как надо.

 

Пока решил пойти на хитрость, т.е. MarketInfo(SymbolName, MODE_TICKVALUE) по-другому считать:

double GetTickValue(string CurrentQuote) {
   string AccountCurr = AccountCurrency();
   string BaseCurr = StringSubstr(CurrentQuote,0,3);
   string CurrentCurr = StringSubstr(CurrentQuote,3,3);
   
   if (CurrentCurr == AccountCurr)  
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE));
   if (BaseCurr == AccountCurr)
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) / MarketInfo(CurrentQuote, MODE_BID));
   if ((CurrentCurr != AccountCurr) && (BaseCurr != AccountCurr))  
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) * MarketInfo(StringConcatenate(BaseCurr,AccountCurr), MODE_BID) / MarketInfo(CurrentQuote, MODE_BID));
}
 
Mepkypuu:

Пока решил пойти на хитрость, т.е. MarketInfo(SymbolName, MODE_TICKVALUE) по-другому считать:

Как написано было, так и правильно. На сколько сдвинется Bid, на столько же сдвинется и Ask, при неизменном спреде.
 
Mislaid:
Как написано было, так и правильно. На сколько сдвинется Bid, на столько же сдвинется и Ask, при немзменном спреде.

Из личной практики, спред как правило изменный, причем достаточно сильно). При резких движениях наблюдал увеличение спреда с 8 до 80 пунктов на пятизнаке.
 
Можно ли закодировать(надежно) двойную вершину?
 
001:
Можно ли закодировать(надежно) двойную вершину?
Можно.
 

При тестировании советника в журнале выскакивает ошибка

2013.08.07 12:35:41 2012.06.06 05:29 Пуриа - 1.452 - SQ EURUSD,M30: Возникла ошибка 4002 (Индекс массива - вне диапазона)

2013.08.07 12:35:41 2012.06.06 05:29 Пуриа - 1.452 - SQ EURUSD,M30: Попытка открыть Buy ордер. Ожидание ответа..

Соответственно ордера не открываются. Как устранить ошибку? Каковы причины ее возникновения?

Буду рад помощи.

 
alexey1979621:

При тестировании советника в журнале выскакивает ошибка

2013.08.07 12:35:41 2012.06.06 05:29 Пуриа - 1.452 - SQ EURUSD,M30: Возникла ошибка 4002 (Индекс массива - вне диапазона)

2013.08.07 12:35:41 2012.06.06 05:29 Пуриа - 1.452 - SQ EURUSD,M30: Попытка открыть Buy ордер. Ожидание ответа..

Соответственно ордера не открываются. Как устранить ошибку? Каковы причины ее возникновения?

Буду рад помощи.

Из одних сообщений терминала мало что будет понятно, мало кто поможет вам, если вы не выложите код советника. Где-то в массив у вас пишется несуществующая партия данных, как одно из предположений, но гадать не мой профиль.