Конкурс советников на реальных счетах - страница 17

 

Вот сейчас посмотрел историю счета и обнаружилось. Что функция закрытия позиций по достижении заданного профита в реале практически не срабатывает! Хотя в тестере работает исправно.

Т.е. в реале прибыльные позиции в значительном большинстве случаев закрываются по тейкрофиту, кот. равет =15 пунктов, - мин. допустимый стопуровень.

А ведь оптимизирован этот пипсовочный эксперт на закрытие +11 по EURCHF и +8 по EURGBP !

Такая разница (особенно 15 и 8 ) оч. чувствительна для пипсовочного эксперта!

Не знаю ещё, почему так случилось.... Функцию закрытия я взял готовую из другой (чужой) конструкции.

Причесал, окультурил (для еврофранка ф-я выглядит так):

//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
//Функция дает команду на  закрытие  позиции при достижении профита , 
//задаваемого  параметром CloseProfit. Для корректной работы 
//этой функции необходимо наличие вспомогателной функции del(int ticket)
void CloseProfit()                                                    {
    if (OrdersTotal() > 0)                                            {
      for (int q = OrdersTotal() + 1; q >= 0; q--)                    {
         if (OrderSelect(q, SELECT_BY_POS, MODE_TRADES))              {
            if (OrderSymbol() == "EURCHF")                            {
               if (OrderMagicNumber() == Magic)                       {
                  if (OrderCloseTime() == 0)                          {
                     if (OrderType() == OP_BUY)                       {
                        RefreshRates();
                        if (Bid > OrderOpenPrice() +CloseProfit* Point) {
                           Print("ClosePozishion"); del(OrderTicket());
                        } }
                     if (OrderType() == OP_SELL)                         {
                        RefreshRates();
                        if (Ask < OrderOpenPrice() - CloseProfit* Point) {
                           Print("ClosePozishion"); del(OrderTicket());
                        }}}}}}}}}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
//Функция реализует закрытие позиций по текущей цене
void del(int ticket) {
   int Error;
   double _bid;
   for (int w = 0; w < 1; w++) {
      GetLastError();
      OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
      if (OrderType() == OP_BUY) {
         RefreshRates();
         _bid = MarketInfo("EURCHF", MODE_BID);
         if (!OrderClose(ticket, OrderLots(), _bid, 3, Green)) Error = GetLastError();
      }
      if (OrderType() == OP_SELL) {
         RefreshRates();
         _bid = MarketInfo("EURCHF", MODE_ASK);
         if (!OrderClose(ticket, OrderLots(), _bid, 3, Green)) Error = GetLastError();
      }
      if (Error == 0) {  PlaySound("expert.wav");  return; }//при  нормальном закрытии  
      //  позиции, - даем сигнал "expert.wav"
      if (Error != 0) {// если произошла ошибка закрытия - сигнал и печать .
         PlaySound("timeout.wav");
         Print("Error for Close Funtion =", Error);
      }
      while (!IsTradeAllowed()) Sleep(5000);//если торг. поток занят, - ждем 5 сек
      if (Error == 146) while (IsTradeContextBusy()) Sleep(10000);
      //если нет соединения с сервером, ждем - 10 сек
   }
}

//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
 

а ошибки выдает ?

эту конструкцию можно упростить

      if (OrderType() == OP_BUY) {
         RefreshRates();
         _bid = MarketInfo("EURCHF", MODE_BID);
         if (!OrderClose(ticket, OrderLots(), _bid, 3, Green)) Error = GetLastError();
      }
      if (OrderType() == OP_SELL) {
         RefreshRates();
         _bid = MarketInfo("EURCHF", MODE_ASK);
         if (!OrderClose(ticket, OrderLots(), _bid, 3, Green)) Error = GetLastError();
      }

вот так

RefreshRates();
if (!OrderClose(ticket, OrderLots(),OrderClosePrice(), 3, Green)) Error = GetLastError();
 
keekkenen писал(а) >>

а ошибки выдает ?

эту конструкцию можно упростить

вот так

По ошибкам я сказать ничего не могу. Т.к. у меня только инвест-пароль от этого счета.

Но на моем счете - реале в этом ДЦ ошибки бывают оч. часто. В коде предусмотрен звуковой сигнал ошибки и этот сигнал я слышу достаточно часто ! Причём, сначала раздается сигнал ошибки закрытия. А через минуту другую, зачастую, раздается сигнал срабатывания тейкпрофита. Иначе говоря, функция закрытия работает оч. некорректно и цена, минуя заданный уровень закрытия, прорывается к уровню тейка !

А по упрощению конструкции, - можно и упростить, но мне так понятнее, - когда всё подробно расписано.

 

вы пишете А ведь оптимизирован этот пипсовочный эксперт на закрытие +11 по EURCHF и +8 по EURGBP !

все просто объясняется, открыли длинную позицию и ждете когда сработает условие чтобы взять законные 15 пунктов

if (OrderType() == OP_BUY){
	RefreshRates();
    if (Bid > OrderOpenPrice() +CloseProfit* Point) {
		Print("ClosePozishion"); del(OrderTicket());
    }
}

но не тут, то было.. покупали выпали по Bid и закрываете по Bid, таким образом теряете спред (4 пункта), т.о. в ифе нужно поставить Ask вместо Bid,

чтобы получить ваши кровные 15 пунктов..


а еще, выше написано что-то непонятное.. если тейкпрофит 15 пунктов, то зачем закрывать раньше ? уточните..

 
keekkenen писал(а) >>

вы пишете А ведь оптимизирован этот пипсовочный эксперт на закрытие +11 по EURCHF и +8 по EURGBP !

все просто объясняется, открыли длинную позицию и ждете когда сработает условие чтобы взять законные 15 пунктов

но не тут, то было.. покупали выпали по Bid и закрываете по Bid, таким образом теряете спред (4 пункта), т.о. в ифе нужно поставить Ask вместо Bid,

чтобы получить ваши кровные 15 пунктов..

а еще, выше написано что-то непонятное.. если тейкпрофит 15 пунктов, то зачем закрывать раньше ? уточните..

Не совсем так. Я хочу закрыть позицию по достижении +11 пипсов профита. В то время, как тейк стоит на уровне +15.(потому что ближе не поставить его - там в ДЦ стопуровень допустимый =15)

Почему вы думаете, что я покупал по бид ? Я по аск покупал.

Но ведь длинные позиции закрываются продажей? - разве нет ?

и поэтому в "и-фе" стоит бид...

Но даже если я и теряю по вашему мнению размер спреда, то этот факт не обьясняет расхождения результатов между реалом и тестером !

Почти 500$ расхождения в худшую сторону лотом =0.1 за 10 дней при 200 сделках.

 
leonid553 >>:

Но даже если я и теряю по вашему мнению размер спреда, то этот факт не обьясняет расхождения результатов между реалом и тестером !

Угу. Есть еще Freeze level, возможно, проблема в нем.
 
TheXpert писал(а) >>

На реале нету почти трети сделок, возможно, это и есть упущенный профит. А возможно, не учтена какая-нибудь вещь. Пишите, разберемся.

С количеством сделок я разобрался. Сейчас прогнал эксперт в тестере с включенной опцией моделирования реквот и число сделок при тесте и на реальном счете примерно (в разумных пределах) совпало.

Т.е. виноваты реквоты. Они сильно сокращают число сделок и, видимо "под соокращение" на реале попало много прибыльных сделок...

Но всё равно, - всего отличия по результатам теста и реала это не обьясняет./

//-------------------------------------------------------------------

И вот вроде бы "взялся за ум" мой эксперт и даже в лидеры выбился...

http://acompetition.love-craft.ru/?q=ru

 
TheXpert писал(а) >>
Угу. Есть еще Freeze level, возможно, проблема в нем.

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

Не думаю, что этот фактор имеет место.

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

А лот предусмотрен пока фиксированный. (0.1)

 
leonid553 >>:

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

Нет - это уровень, ближе которого нельзя модифицировать отложки, а также тейки и лоси.

 
Благодарю за пояснение. Пойду прояснять этот вопрос на сайте ДЦ.
Причина обращения: