[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 237

 

Здравствуйте.

Подскажите, с чем может быть связана нижеуказанная ситуация (тестер выдал вначале ошибку тикета 15, но потом всё же закрыл данный ордер)? Стоит ли мне на неё обратить более пристальное внимание?

Заранее благодарю.

 
nemo811:

Стоит ли мне на неё обратить более пристальное внимание?


конечно. никаких ошибок не должно быть.
 

Отчень прошу помочь.

Есть ли здесь ошибка? (Код возвращает тикет последнего рыночного SELL-ордера)

int OrdTicketSell_b(int MAGIC)
 {
  string SMB=Symbol();
  int OrdTicketSell=0;
  int i;
  for(i=0;i<OrdersTotal();i++)
   {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)
     {
      if(OrderSymbol()==SMB)
       {
        if(OrderMagicNumber()==MAGIC || OrderMagicNumber()==777)
         {
          if(OrderType()==OP_SELL)
           {
            OrdTicketSell=OrderTicket();
           }  
         }  
       }          
     }
   }
   if(OrderTicket()!= OrdTicketSell) OrderSelect(OrdTicketSell, SELECT_BY_TICKET);
   return(OrdTicketSell);
 }

Заранее благодарю.

 
int OrdTicketSell_b(int MAGIC)
 {
  string SMB=Symbol();
  int OrdTicketSell=-1;
  int i;
  for(i=0;i<OrdersTotal();i++)
   {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)
     {
      if(OrderSymbol()==SMB)
       {
        if(OrderMagicNumber()==MAGIC || OrderMagicNumber()==777)
         {
          if(OrderType()==OP_SELL)
           {
            OrdTicketSell=OrderTicket();
           }  
         }  
       }          
     }
   }
   if(OrderTicket()!= OrdTicketSell && OrdTicketSell>=0) OrderSelect(OrdTicketSell, SELECT_BY_TICKET);
   return(OrdTicketSell);
 }
 

Добрый день.

Интересен такой момент: в mql4 переменная в конце блока { int var; } не уничтожается, отсюда вопрос правильно ли объявлять переменную в цикле ???

Пример:

for(int i = 0; i < 500; i ++)

{

int var; // что происходит с переменной при ретерациях?

}

Спасибо.

 
sergeev:

Не - вроде ещё не в яблочко. Та же ошибка выползает.

Осталась последняя часть кода, с кот. может быть всё связано:

     int SchSell=SchSell_b(MAGIC);
     int OrdTicketSell=OrdTicketSell_b(MAGIC);
     double MinLot=MarketInfo(SMB,MODE_MINLOT);

     if(ChastZakr)
      {
       if(SchSell>1)
        {  
         OrderClose(OrdTicketSell,OrderLots(),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);
         Alert(SMB,": произведено частичное закрытие Sell-позиции, тикет: ",OrdTicketSell,".");
        }   
       else
        {  
         if(SchSellLots>MinLot)
          { 
           OrderClose(OrdTicketSell,NormalizeDouble(OrderLots()/2,2),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);
           Alert(SMB,": произведено частичное закрытие Sell-ордера, тикет: ",OrdTicketSell,".");
          }  
        }  
      }

Самое интересное, что ошибка появляется, когда идёт попытка закрытия ордера, кот. до этого был лимитником, но впоследствии сработал и стал рыночным. Если закрывается ордер, кот. изначально был рыночным - ошибка не возникает.

 

Нашёл ошибку, вот выход:

     int SchSell=SchSell_b(MAGIC);
     double MinLot=MarketInfo(SMB,MODE_MINLOT);

     if(ChastZakr)
      {
       int OrdTicketSell=OrdTicketSell_b(MAGIC);
       if(SchSell>1)
        {  
         OrderClose(OrdTicketSell,OrderLots(),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);
         Alert(SMB,": произведено частичное закрытие Sell-позиции, тикет: ",OrdTicketSell,".");
        }   
       else
        {  
         if(SchSellLots>MinLot)
          { 
           OrderClose(OrdTicketSell,NormalizeDouble(OrderLots()/2,2),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);
           Alert(SMB,": произведено частичное закрытие Sell-ордера, тикет: ",OrdTicketSell,".");
          }  
        }  
      }
 
nemo811:

Нашёл ошибку, вот выход:


Можно глупый вопрос? Какая -то странная нормализация

OrderClose(OrdTicketSell,NormalizeDouble(OrderLots()/2,2),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);

Не могу понять зачем так делается.

 
Vinin:


Можно глупый вопрос? Какая -то странная нормализация

Не могу понять зачем так делается.

Это на случай, если задействован лот 0,03 при минимально допустимом 0,01. При делении 0,03 на 2 получаем 0,015, что, на сколько я понимаю, недопустимо. Поэтому я и сделал такую нормализацию.

Строго не судите - я только учусь )). Но если это ошибка - поправьте меня, пожалуйста.

 
artmedia70:
Начните делать и поможем. А так выглядит как "сделайте за меня". Там же практически всё готово, что вам нужно. Осталось только в цикле выставлять тейки и стопы вашим ордерам.

вот так открываются ордера:

                ticketSell = OpenPendingOrderSell(1, Lots, SellLimit, slip, SellLimit, 0, 0, EAName + "-" + NumOfTradesSell, MagicNumber, 0, HotPink);
                if (ticketSell < 0)
                {
                        Print("Error: ", GetLastError());
                        return (0);
                }

я хочу сделать, что бы скрипт без убыток вот как просчитывал:

если

if (totalBuy > 1)
{ то ордерам ticketBuy присвоить цену без убытка + TakeProfitBuy, при достижении этой цены или ниже, закрыть ордера}

я думаю, что можно что то в роде такого сделать:

if (totalBuy > 1 && (без убыток + TakeProfitBuy) >= Bid)
{
CloseAllBuy();
}

если

if (totalSell > 1 && (без убыток + TakeProfitSell) <= Ask)
{
CloseAllSell();
}

если

if (totalSell > 1 && totalBuy > 1 && (без убыток + TakeProfitSell) >= Ask)
{
CloseAllBuy();
CloseAllSell();
}

как правильно вставить этот код определения линии без убытка в советника:

int start()
{
   int b,s;
   double price,price_b,price_s,lot,lot_s,lot_b,SLb,SLs;
   for (int i=0; i<OrdersTotal(); i++)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {  if (OrderSymbol()==Symbol())
         {
            price = OrderOpenPrice();
            lot   = OrderLots();
            if (OrderType()==OP_BUY ) 
               {price_b = price_b+price*lot; b++;  lot_b=lot_b+lot;}
            if (OrderType()==OP_SELL) 
               {price_s = price_s+price*lot; s++;  lot_s=lot_s+lot;}
   }  }  }
   ObjectDelete("SLb");
   if (b!=0) 
   {  SLb = price_b/lot_b;
      ObjectCreate("SLb",OBJ_ARROW,0,Time[0],SLb,0,0,0,0);                     
      ObjectSet   ("SLb",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SLb",OBJPROP_COLOR, Navy);
   }
   ObjectDelete("SLs");
   if (s!=0) 
   {  SLs = price_s/lot_s;
      ObjectCreate("SLs",OBJ_ARROW,0,Time[0],SLs,0,0,0,0);                     
      ObjectSet   ("SLs",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SLs",OBJPROP_COLOR, Maroon);
   }
}