Профи подскажите

 

Доброго времени суток форумчани.

Вопрос такой, есть скрипт вот он

#property copyright удалил

#property link удалил
#property show_inputs
extern int MaxRisk=2; //Проценты
extern bool Buy=false;
extern bool Sell=false;
extern int TakeProfit=50;
extern int StopLoss=50;



//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
//----

double Lot=GetLot(MaxRisk);
if (Lot==0) {Alert("Нет денег");return(0);}

while (!IsTradeAllowed()) Sleep(100);

if (Buy)
{

NewOrder (OP_BUY,Lot,0,0,0,17);
}

while (!IsTradeAllowed()) Sleep(100);

if (Sell)
{

NewOrder (OP_SELL,Lot,0,0,0,17);
}

return(0);
}
//+------------------------------------------------------------------+


int NewOrder(int Cmd,double Lot,double PR=0,double TP=0,double SL=0,int Mag=0)
{while(!IsTradeAllowed()) Sleep(100);
if(Cmd==OP_BUY)
{PR=NormalizeDouble(Ask,Digits);
if(TP==0 && TakeProfit>0) TP=PR+TakeProfit*Point;
if(SL==0 && StopLoss>0) SL=PR-StopLoss*Point;}
if(Cmd==OP_SELL)
{PR=NormalizeDouble(Bid,Digits);
if(TP==0 && TakeProfit>0) TP=PR-TakeProfit*Point;
if(SL==0 && StopLoss>0) SL=PR+StopLoss*Point;}
RefreshRates() ;
int tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP,"",0,0,CLR_NONE);
if(tic<0) Print("Ошибка открытия ордера: ",GetLastError());
return(tic);}

double GetLot(int Risk)
{double Free =AccountFreeMargin();
double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
double Lot =MathFloor(Free*Risk/100/One_Lot/Step)*Step;
if(Lot<Min_Lot) Lot=Min_Lot;
if(Lot>Max_Lot) Lot=Max_Lot;
if(Lot*One_Lot>Free) return(0.0);
return(Lot);}

Он работает нармально. Им открываю ордера. И вот советник :

#property copyright

#property link
#property show_inputs
extern int Shag=15;
int minlev=0;


//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{

}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{

return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----

minlev=MarketInfo(Symbol(),MODE_STOPLEVEL);

if (Shag<minlev){Alert("Шаг не может быть меньше чем допустимый уровень StopLoss,TakeProfit = ",minlev);return(0);}
//Вычисляем лот


for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
if (OrderMagicNumber()==17)
{
if (OrderType()==OP_BUY)
{
if (Ask>OrderOpenPrice()&&Ask>(OrderOpenPrice()+Shag*Point))
{
//void EditOrder(int tic,double sl,double tp)
EditOrder(OrderTicket(),(OrderOpenPrice()+(Shag-minlev)*Point),(OrderTakeProfit()+(Shag-minlev)*Point));
}
}

if (OrderType()==OP_SELL)
{
if (Bid<OrderOpenPrice()&&Bid<(OrderOpenPrice()-Shag*Point))
{
//void EditOrder(int tic,double sl,double tp)
EditOrder(OrderTicket(),(OrderOpenPrice()-(Shag-minlev)*Point),(OrderTakeProfit()-(Shag-minlev)*Point));
}
}
}
}
}

return(0);
}
//+------------------------------------------------------------------+

void EditOrder(int tic,double sl,double tp)
{while(!IsTradeAllowed()) Sleep(100);
if(OrderSelect(tic,SELECT_BY_TICKET))
if(!OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,CLR_NONE))
Print("Ошибка редактирования ордера: ",GetLastError());

return;}


Цель советника найти на графике ордера с магик.числом = 17

проверить ордер на покупку или продажу и в случай превышения (или понижения) текущей цены модифицировать стоплосс и тейкпрофит. После запуска в журнале пишет Expert ZdvigLevel EURCHF,H1: removed. Вчём проблема?

За ранние всем СПАСИБО

 

Sasha2401:

...

За ранние всем СПАСИБО


Вставьте для начала код через SRC в форме ввода сообщений. Сложно читать Ваш код, когда он весь серый.
 

Похоже всё верно (не проверял). Но попробуйте цикл считать с другой стороны. Вот так:

for(int i=OrdersTotal()-1; i>=0; i--)
 
Sasha2401:

Доброго времени суток форумчани.

Вопрос такой, есть скрипт вот он


Он работает нармально. Им открываю ордера. И вот советник :


Цель советника найти на графике ордера с магик.числом = 17

проверить ордер на покупку или продажу и в случай превышения (или понижения) текущей цены модифицировать стоплосс и тейкпрофит. После запуска в журнале пишет Expert ZdvigLevel EURCHF,H1: removed. Вчём проблема?

За ранние всем СПАСИБО


Первое, что сразу бросается в глаза - при открытии ордеров в советнике (скрипте) присваивайте им соответствующий магик, посредством его задания во внешних переменных

extern int magic = 1000;

и далее его использовать в ф-ии открытия ордеров, типа этого

if (cmd == OP_BUY) ticket = OrderSend(symbol, cmd, volume, Ask, SlipPips, stoploss, takeprofit, comment, magic, expiration, clr);
if (cmd == OP_SELL) ticket = OrderSend(symbol, cmd, volume, Bid, SlipPips, stoploss, takeprofit, comment, magic, expiration, clr); 
  

Вот как подобная конструкция трала именно ордеров ЭТОГО экспа организована у меня - работает без сбоев:

Level_new=MarketInfo(Symbol(),MODE_STOPLEVEL );    
 
   int orderCount = 0;  
      // ------------------------------------------------Считаем только наши ордера---------------------------

   int orderType;
   for (orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
   {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))      continue;
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))    continue;
      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL))     continue;
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          orderProfit = OrderProfit() + OrderSwap();       // Profit
          Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера
          
             if (ticket>0)                                               // Если позиция открылась
                    {
                             while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                                 {
                                   Sleep(100);
                                 }
                                  double OpenPrice=OrderOpenPrice();
                    }        
         
      orderCount++;                     // считаем ордера (не больше i)     
      
      //----------------------------Тралим последовательно все ордера  ЭТОГО ЭКСПА по виду трала------------------
      if (UseTrailing && orderCount > 0 && type ==0)   // простой трал по аналогии учебнику - в зависимости от параметра trlinloss (тралить ли в зоне лоссов)
          {     
           if (orderType == OP_BUY)  SampleTrailing_texbook (0);          // если бай
           if (orderType == OP_SELL) SampleTrailing_texbook (1);          // если селл
          }         
     
    }   

Вот сама ф-ия трала по учебнику - описание см. на этой страничке последняя функция:

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

в Вашем скрипте, магик нигде не используется, стало быть ордера открываются с магиком = 0

int tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP,"",0 ,0,CLR_NONE);

поэтому в скрипте надо так:

int tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP,"",Mag,0,CLR_NONE);

это по крайней мере, остальное не проверял

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