Помогите решить идиотскую проблему

 

Вообщем не понимаю или я идиот, или ерунда какая то или проблема тестера....

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

void TralBuy()
{
double SL0=iSAR(NULL,TFT,XT,YT,0)-Spread*Point;

if(LastBar1!=iTime(NULL,TFT,0) && SL0>OrderStopLoss())
{                                                                                                                                                                                 
bool Ans0;                                              
Ans0=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL0,Digits),NormalizeDouble(OrderTakeProfit(),Digits),0); 
LastBar1=iTime(NULL,TFT,0); 
if(Ans0==false)                                        
{ Alert("Case1,Ордер ",OrderTicket()," не модифицирован");}      
}
}
 
shumaher9:

Вообщем не понимаю или я идиот, или ерунда какая то или проблема тестера....

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


Надо так

// ТРЕЙЛИНГ ПО ParabolicSar                                       
// значение индикатора на 3-ом баре, по которому необходимо трейлинговать и отступ  (пунктов) - 
// расстояние от значения индикатора, на которое переносится стоплосс (от 0)       
//-----------------------------------------------------------------
//--------------------------------------------------------------- 1 --
// Функция модификации StopLoss всех ордеров указанного типа
// Глобальные переменные:
// Mas_Ord_New             Массив ордеров последний известный
//--------------------------------------------------------------- 2 --
void SARTrailing_texbook(int Tip)
  {
   int Ticket;                      // Номер ордера
   double
   Price,                           // Цена открытия рыночного ордера
   TS,                              // TralingStop (относит.знач.цены)
   SL,                              // Значение StopLoss ордера
   TP;                              // Значение TakeProfit ордера
   bool Modify;                     // Признак необходимости модифи.
   
   
    int j;    
    double prev_Sar;                // значение SAR на 1-ом баре
    double new_extremum;
    double newstop;                  // новый стоплосс
    
      Level_new=MarketInfo(Symbol(),MODE_STOPLEVEL ); // мин уровень трала
      Modify=false;                       // Пока не назначен к модифи
      Price = OrderOpenPrice();           // Цена открытия ордера
      SL    = OrderStopLoss();            // Значение StopLoss ордера
      TP    = OrderTakeProfit();          // Значение TakeProft ордера
      Ticket= OrderTicket();                // Номер ордера
    //-----------------------------------------------------------
      
      prev_Sar = iSAR (Symbol(),0, Step, Maximum, 3);
            
      switch(Tip)                         // Переход на тип ордера
        {
         case 0 :                         // Ордер Buy
          if (trlinloss==false){         // тралим только профит
             if (( ( (prev_Sar - (indent+ MarketInfo(Symbol(),MODE_SPREAD))*Point) > NormalizeDouble(SL,Digits)) || (NormalizeDouble(SL,Digits)==0)) && 
                     (prev_Sar - (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point < Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) && 
                      prev_Sar < Bid && NormalizeDouble(Price,Digits) <  NormalizeDouble(prev_Sar - (indent+ MarketInfo(Symbol(),MODE_SPREAD))*Point,Digits))
                                                                                                                            // Если ниже желаемого и в профите
                {                                     // то модифицируем его    
                  SL = prev_Sar - (indent+ MarketInfo(Symbol(),MODE_SPREAD))*Point;        // Новый его StopLoss
                  Modify=true;                         // Назначен к модифи.
                }
             }  
             
           else {
           
             if (( ( (prev_Sar - (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point) > NormalizeDouble(SL,Digits)) || (NormalizeDouble(SL,Digits)==0)) && 
                     (prev_Sar - (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point < Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) && 
                      prev_Sar < Bid)                 // Если ниже желаемого
               {                                     // то модифицируем его    
                 SL = prev_Sar - (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point;           // Новый его StopLoss
                 Modify=true;                         // Назначен к модифи.
               } 
           }   
         
           break;                               // Выход из switch
            
         case 1 :                         // Ордер Sell
                  
           if (trlinloss==false){         // тралим только профит
           
               if ( ( (  (prev_Sar + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point) < NormalizeDouble(SL,Digits)) || (NormalizeDouble(SL,Digits)==0)) &&
                         (prev_Sar + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point > Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) &&
                          prev_Sar > Ask && NormalizeDouble(Price,Digits) >  NormalizeDouble(prev_Sar + (indent+MarketInfo(Symbol(),MODE_SPREAD))*Point,Digits))
         
          
                    {                                                                         // то модифицируем его    
                       SL = prev_Sar + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point;     // Новый его StopLoss
                       Modify=true;                                                           // Назначен к модифи.
                    }  
           }        
     
          else {
      
              if ( ( (  (prev_Sar + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point) < NormalizeDouble(SL,Digits)) || (NormalizeDouble(SL,Digits)==0)) &&
                        (prev_Sar + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point > Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) &&
                         prev_Sar > Ask)
         
          
                    {                                                                         // то модифицируем его    
                       SL = prev_Sar + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point;     // Новый его StopLoss
                       Modify=true;                                                           // Назначен к модифи.
                    }  
           }        
                   
        }                                 // Конец switch
        
      if (Modify==false)                  // Если его не надо модифи..
         return;                        // ..то идём по циклу дальше
      bool Ans=OrderModify(Ticket,Price,SL,TP,0,Olive);//Модифицируем его!
      //--------------------------------------------------------- 5 --
      if (Ans==false)                     // Не получилось :( 
       
          {                                 // Поинтересуемся ошибками:
            Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());
            return;                       // .. то уходим.
          }
                                         // Выход из пользов. функции
  }
//--------------------------------------------------------------- 6 --


Вызов этой ф-ии из СТАРТА эксперта

 if (UseTrailing==1 && orderCount > 0 && type == 7)                     // трал по аналогии учебнику - по SAR
          {     
           if (orderType == OP_BUY)  SARTrailing_texbook (0);          // если бай
           if (orderType == OP_SELL) SARTrailing_texbook (1);          // если селл
          }        

Внешние переменные

extern string Trailing = "---------- Параметры трала";
extern int UseTrailing = 0;                // 0/1 - Использовать трал
extern int  type = 7;                      // вид трала - возможные значения: 0 - простой, 1 - по фракталам, 2 - по теням N свечей, 3 - по 2-м АТР,
                                           // 4 - по ценовому каналу, 5 - по МА, 6 - половинящий, 7 - по SAR.   
extern bool trlinloss = false;             // Тралим только профит для всех видов тралов

extern string A5 = "Параметры простого трала,пo фракталам,теням N баров,каналу,МА,SAR";
extern int  TralingStop = 1000;            // дистанция простого трала в положительной зоне (пункты)

extern int  indent = 100;                  // отступ (пунктов) при трале по фракталам, теням N свечей, ценовому каналу, МА,SAR
extern int  bars_n = 10;                   // количество баров, для трала по их теням (от 1 и больше) или расчета границ канала 

extern int  Period_MA_tral = 9;            // для трала по МА 

extern double Step = 0.02;                 // SAR
extern double Maximum = 0.2;

Написан по аналагии учебнику - здесь. Сам пока его (ИМЕННО ЭТОТ ТИП ТРАЛА) здесь (в такой конструкции) не юзал, но должен работать исправно.

 
double SL0=iSAR(NULL,TFT,XT,YT,0)-Spread*Point;

Смелое решение. Неординарное.

Смесь домашних тапочек с до мажором.

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

 
Roman.:


Надо так

Вызов этой ф-ии из СТАРТА эксперта

Внешние переменные

Написан по аналагии учебнику - здесь. Сам пока его (ИМЕННО ЭТОТ ТИП ТРАЛА) не юзал, но должен работать исправно.


Ты проблемы не понял... Трал по сару у меня работыет исправно!!!! проблема в том что я не могу сделать так что бы трал не выстовлял лося меньше чем уже стоит, то есть обратно что бы стопы не двигал!!!!
 
shumaher9:

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


Смотри, как у меня организован код при бае и селле и ставь по аналогии его к себе в код и все - " то есть обратно что бы стопы не двигал!!!! " - обратно двигать не будет.

Переноси к себе условия, например, для бая

if (( ( (prev_Sar - (indent+ MarketInfo(Symbol(),MODE_SPREAD))*Point) > NormalizeDouble(SL,Digits)) || (NormalizeDouble(SL,Digits)==0)) && 
                     (prev_Sar - (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point < Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) && 
                      prev_Sar < Bid && NormalizeDouble(Price,Digits) <  NormalizeDouble(prev_Sar - (indent+ MarketInfo(Symbol(),MODE_SPREAD))*Point,Digits))
                                                                                                                            // Если ниже желаемого и в профите
                {                                     // то модифицируем его    
                  SL = prev_Sar - (indent+ MarketInfo(Symbol(),MODE_SPREAD))*Point;        // Новый его StopLoss
                  Modify=true;                         // Назначен к модифи.
                }
 
hhohholl:

Смелое решение. Неординарное.

Смесь домашних тапочек с до мажором.

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


Что тебя удивило, не понял? TFT,XT,YT, Spread - переменные. Не понимаю что ты имеешь ввиду по поводу категории цен???
 
Roman.:


Смотри, как у меня организован код при бае и селле и ставь по аналогии его к себе в код и все.


Может человек понять хочет.

void TralBuy() {
   double SL0 = iSAR(NULL,TFT,XT,YT,0) - Spread*Point;
   if(LastBar1 != iTime(NULL,TFT,0) && SL0 > OrderStopLoss()) { 
      bool Ans0 = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL0,Digits),OrderTakeProfit(),0); 
      LastBar1 = iTime(NULL,TFT,0); 
      if(Ans0 == false) Alert("Case1,Ордер ",OrderTicket()," не модифицирован");
   }      
}

мне кажется что ордер выбрать нужно, а то условия выполняются, а какой ордер модифицируется - ХЗ

ps я не вникаю откуда берется SL0, но если SL0 > OrderStopLoss() уровень должен лезть вверх

 

Ордер выбран до этого! с этим тоже проблемы нет

Почему советник игнорирует эту запись SL0 > OrderStopLoss()? где SL0 новый стоп лосс

 
valenok2003:


Может человек понять хочет.

мне кажется что ордер выбрать нужно, а то условия выполняются, а какой ордер модифицируется - ХЗ

Из кода этого не понять, т.к. это лишь сама ф-ия модифи ордера, мош он до нее уже выбрал ордер - а так скорей всего и есть, т.к. он пишет, что модифи работает, но не правильно, а это из-за того, что не в полном объеме прописаны необходимые и достаточные условия для трала выбранного ордера! Так и есть. Я ему привел ВЕРНЫЕ условия для трала, чтобы в обратку трал не работал - но работал строго в сторону открытого ордера.
 
shumaher9:

Ордер выбран до этого! с этим тоже проблемы нет

Почему советник игнорирует эту запись SL0 > OrderStopLoss()? где SL0 новый стоп лосс


Если ордер выбран - тикет передайте в функцию. И другие параметры, как OrderStopLoss()
 
shumaher9:

Ордер выбран до этого! с этим тоже проблемы нет

Почему советник игнорирует эту запись SL0 > OrderStopLoss()? где SL0 новый стоп лосс


Вы одно поймите, что у Вас не исключено здесь МНОГОЕ не верно - отойдите от своего кода - берите грамотно написанный код из библиотеки трайлинг-стопов от Юрия Дзюбана и правите подобную ф-ию под Ваш параболик сар, например меняете трал по МА или ценовому каналу - подход тот же, код грамотный - все работает - что еще Вам надо??? Зачем изобретать велосипед, натыкаясь на одни и те же грабли, когда все уже давно украдено до Вас (с)...

Берете, правите, пользуетесь - в прицепе - библиотека тралов + описание.

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