Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 360

 

Добрый день.

 Подскажите пожалуйста, как правильно написать код при торговле советником в МТ4, сам в программировании очень новичок.

Мне нужно выбрать последний закрытый ордер и сравнить профит, по условию если профит ордера больше 0 то, не чего не делать, если меньше 0 то что либо сделать.

double GetSizeLot(double lastlot=0) //Функция возвращает значение лотов 
  {
   double Lot2,MinLots,MaxLots;
   int j=OrdersHistoryTotal();
   
   MinLots=Lots;
   MaxLots=MaxLot;
   if(!DynamicLot)Lot2=Lots;
   if(lastlot<Lot2)lastlot=Lot2;
   
   if(OrderSelect(j,SELECT_BY_POS,MODE_HISTORY))
     {
     if(OrderProfit()<0) lastlot=lastlot*Martin;
     if(OrderProfit()>0) lastlot=Lot2;
     }
   Lot2=lastlot;
   if(Lot2 < MinLots) Lot2 = MinLots;
   if(Lot2 > MaxLots) Lot2 = MaxLots;
   return(NormalizeDouble(Lot2,2));
  }

 С уважением, Александр.

 
Menshikov:

Добрый день.

 Подскажите пожалуйста, как правильно написать код при торговле советником в МТ4, сам в программировании очень новичок.

Мне нужно выбрать последний закрытый ордер и сравнить профит, по условию если профит ордера больше 0 то, не чего не делать, если меньше 0 то что либо сделать.

 С уважением, Александр.

//+------------------------------------------------------------------+

datetime time=0; double profit=0,lots=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      if(OrderSymbol()==_Symbol)
         if(OrderMagicNumber()==MagicNumber || MagicNumber==-1)
            if(OrderCloseTime()>time) // находим последний в истории ордер
              {
               time=OrderCloseTime(); // запомним время
               profit=OrderProfit();  // запомним профит
               his_lt=OrderLots();    // запомним лот
              }

if(profit<0) //если профит меньше нуля
   lots=his_lt*2; // Увеличим в два раза

//+------------------------------------------------------------------+
 
Vladimir Pastushak:
Большое спасибо.
 
Vladimir Pastushak:
Интересно, а для чего time, для чего время закрытия запоминаете, если всё-равно последний в списке выбираете, да ещё и цикл? И почему не учитываете своп и комиссию? Даже при OrderProfit()>0, его реальный профит может быть отрицательным. Вы уж если работаете сразу со списком ордеров, то не нужно и оставлять куски от кода цикла поиска последнего по времени закрытия. Что-то одно - либо надёжность и уверенность, либо скорость. А у вас мешанина.
 
Artyom Trishkin:
Интересно, а для чего time, для чего время закрытия запоминаете, если всё-равно последний в списке выбираете, да ещё и цикл? И почему не учитываете своп и комиссию? Даже при OrderProfit()>0, его реальный профит может быть отрицательным. Вы уж если работаете сразу со списком ордеров, то не нужно и оставлять куски от кода цикла поиска последнего по времени закрытия. Что-то одно - либо надёжность и уверенность, либо скорость. А у вас мешанина.

Вы предлагаете

   if(OrderSelect(OrdersHistoryTotal(),SELECT_BY_POS,MODE_HISTORY))

Так делать ?

Человек просил только про ордер профит, зачем навяливать то чего не просили ? Но я с Вами согласен ....

 

Подскажите пожалуйста как в MQL4 на MT4 сделать так чтобы открытый ордер закрывался через 20 баров, то есть, открыл ордер, и как появилось 20 новых баров - ордер закрылся. (открыт всегда только 1 ордер). У меня почему-то данный код не работает в тестере стратегий, а нужно чтобы работал.


смысл этого кода такой: проверяем есть ли открытые ордера, если нет, то открываем ордер и записываем в переменную "z" цену открытия 1-бара, затем с каждым тиком проверяем цену открытия 20-го бара, и когда тот самый 1-й бар со временем станет 20-м то и цена его будет совпадать с ценой записанной в переменную "z", после чего ордер будет закрыт. (конечно в процессе могут возникнуть совпадения цен, но это будет очень редко, к тому же можно записать еще несколько параметров 1-го бара в переменные)


double z; //объявление переменной

           //ОТКРЫТИЕ ОРДЕРА
           if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер
              {
               OrderSend(Symbol(), OP_SELL, 0.1, Bid, 3, Bid+150*Point, Bid-10*Point);
                   z = Open[1]; // здесь переменной "z" присваивается цена открытия 1-го бара
              }
            else

           Print("ORDER NE USTANOVLEN!!!");




           //ЗАКРЫТИЕ ОРДЕРА

    if (z==Open[20])  //если цена записанная в переменную "z" равна цене 20-го бара, то закрывать ордер
        {
           

            //-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;

 while (OrdersTotal()>0)
 {
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {   if(OrderType()==OP_BUY)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
           OrderDelete(OrderTicket());
         
           if(result!=TRUE) { error=GetLastError();
              Print("LastError = ",error, " ",Symbol()); }
           else error=0; }
   else Print( "Error when order select ", GetLastError());

  }
//------------конец кода закрывающего ордер------------------
           
           
        }
      else
      Print("ORDER NE ZAKRYT!!!");
 
BEGEMOT32:

Подскажите пожалуйста как в MQL4 на MT4 сделать так чтобы открытый ордер закрывался через 20 баров, то есть, открыл ордер, и как появилось 20 новых баров - ордер закрылся. (открыт всегда только 1 ордер). У меня почему-то данный код не работает в тестере стратегий, а нужно чтобы работал.


смысл этого кода такой: проверяем есть ли открытые ордера, если нет, то открываем ордер и записываем в переменную "z" цену открытия 1-бара, затем с каждым тиком проверяем цену открытия 20-го бара, и когда тот самый 1-й бар со временем станет 20-м то и цена его будет совпадать с ценой записанной в переменную "z", после чего ордер будет закрыт. (конечно в процессе могут возникнуть совпадения цен, но это будет очень редко, к тому же можно записать еще несколько параметров 1-го бара в переменные)


всё, разобрался сам, нужно было объявлять переменную за пределами int start() - теперь работает нормально
 
BEGEMOT32:
всё, разобрался сам, нужно было объявлять переменную за пределами int start() - теперь работает нормально

Я Вам упростил чуть чуть, но в вашем коде всё равно есть ошибки

//ОТКРЫТИЕ ОРДЕРА
if(OrdersTotal()==0) // если нет открытых ордеров то открывать ордер
   if(OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+150*Point,Bid-10*Point)<0)
      Print("ORDER NE USTANOVLEN!!!");

//-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;
   while(OrdersTotal()>0)
     {
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
        {
         if(iBarShift(OrderSymbol(),Period(),OrderOpenTime())==20)
           {
            if(OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
            if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
            if(OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
               OrderDelete(OrderTicket());
           }
         if(result!=TRUE)
           {
            error=GetLastError();
            Print("LastError = ",error," ",Symbol());
           }
         else error=0;
        }
      else Print("Error when order select ",GetLastError());

     }
 

Пишу мультивалютный советник но никак не могу понять почему если советник вешаю на разные валюты то возвращает разные цены в одно и то же время

Если кратко то по коду:

в Init

EventSetTimer(60);

 в OnTimer()

MqlTick last_tick;
if(SymbolInfoTick("EURNZD",last_tick))
{
    Print("Last Ask: ", last_tick.ask);
}

 Если тестирую советника на EURNZD  то к примеру 

2015.05.18 00:07:00   Lat Ask: 1.5370

Если советника вешаю на любую другую валютную пару 

2015.05.18 00:07:00   Lat Ask: 1.5323 

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

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

 

Забыл добавить что это Meta Trade 5 

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

 
1.Можно узнать по истории, сколько в тиковом объеме было тиков вверх и вниз?

2.Уже несколько месяцев, как удалил авточартис, а сообщения в журнале появляются. Программа все пытается открыть файлы. 

Как затереть полностью авточартис?

2015.05.25 15:36:42.983 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Volatility.ex4' [2]
2015.05.25 15:36:42.983 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Key Levels.ex4' [2]
2015.05.25 15:36:42.982 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Chart Patterns.ex4' [2]