Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 194

 
Кто в курсе - если закрыть часть ордера, то его магик или коммент исчезнет?
 
Renat Akhtyamov:
Кто в курсе - если закрыть часть ордера, то его магик или коммент исчезнет?

Магик останется, тикет ордера изменится, а в комментарий будет вписан тикет родительского ордера from#xxxxxxxxx. В родительский ордер будет вписан тикет дочернего: to#xxxxxxxxx

 
Artyom Trishkin:

Магик останется, тикет ордера изменится, а в комментарий будет вписан тикет родительского ордера from#xxxxxxxxx. В родительский ордер будет вписан тикет дочернего: to#xxxxxxxxx

Ок. Спасибо!
 
geratdc:


Да, там эта К ещё в экстерн переменные выведена  в верхней шапке указана может это возвращаемое значение какой-то функции...


Алексей а что можно сказать про мою проблему? Трейлинг пытаюсь прикрутить к стоп переворотным ордерам . Встречались с таким?

А чтобы ответить что-то по этой проблеме, надо понять саму проблему. А из этого

geratdc:

Нужна помощь - у меня стоп перевороты - 3 ордера, но пример трейлинга из видеоуроков :) только для несвязанных ордеров, у меня же они связаны алгоритмом то есть тейкпрофит считается по сумме трёх ордеров ну или одного если сразу в тренд попал. Ну вот я что-то придумал, но больше советник зарабатывать не стал - он стал зарабатывать столько же но в 2-3 раза меньше сделок получается в сравнении с предыдущей без трейлинга. В общем у  меня не трейлинг а мутотень какая-то. Как мне на связанные ордера его сделать кто-нибудь может подсказать идею? Я боюсь уже больше ничего не придумаю, вот результат моего "трейлинга" - выделен синим шрифтом:

Результат по 1 тесту приложил. Есть там трейлинг стоп или нет? Не пойму. Почему сумма прибыли за тот же период не увеличилась? А только количество сделок уменьшилось в 2-3 раза? 


я понять ничего не могу. Самое странное, это "Ну вот я что-то придумал" а сам-то понял что придумал? И ещё это "Как мне на связанные ордера его сделать". Но всё-же есть и понятные выражения "Я боюсь уже больше ничего не придумаю".

 
Alexey Viktorov:

А чтобы ответить что-то по этой проблеме, надо понять саму проблему. А из этого

я понять ничего не могу. Самое странное, это "Ну вот я что-то придумал" а сам-то понял что придумал? И ещё это "Как мне на связанные ордера его сделать". Но всё-же есть и понятные выражения "Я боюсь уже больше ничего не придумаю".


Как я понял к ордерам трейлинг не применишь корректно поэтому надо к этой функции CalculateProfit присмотреться  а именно к переменной "op" по которой закрытие ордеров идёт если сумма профитов по всем 3 ордерам равна TakeProfit и тралить пытаться через эту переменную. Попробую что-нибудь придумать в этом направлении. Ну я понимаю что в сторонние абраКОДабры сложно вникать)))
 
geratdc:

Как я понял к ордерам трейлинг не применишь корректно поэтому надо к этой функции CalculateProfit присмотреться  а именно к переменной "op" по которой закрытие ордеров идёт если сумма профитов по всем 3 ордерам равна TakeProfit и тралить пытаться через эту переменную. Попробую что-нибудь придумать в этом направлении. Ну я понимаю что в сторонние абраКОДабры сложно вникать)))
Почему не применишь??? Надо не к чужой функции что-то приделывать или придумывать, а свои писать так, чтобы они выполняли всё что ты сам хочешь. Ну в чём может быть проблема? Сколько-бы нибыло ордеров, посчитать среднюю цену и от неё вести трал... При выполнении какого-то условия перебирая в цикле все ордера переставить им стопы на новый уровень который посчитан от средней цены всех имеющихся ордеров одного направления.
 
//+------------------------------------------------------------------+
//|                                     BLACKJACK&HOOKERS TrailX.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double  Lots           = 0.01;
extern double  TakeProfit     = 1;
extern int     Step           = 1;

extern double  TrailXStep     = 1;
extern double  TrailXStop     = 1;

extern int     MaPeriod       = 100;
extern int     MaShift        = 1;

extern int     Magic          = 123;
extern int     Slippage       = 5;

int timeprev=0;

extern double price,op,cn,tp;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)
      //TakeProfit     *= 10;
      Step           *= 10;
      //TrailXStep     *= 10;
      //TrailXStop     *= 10;
      Slippage       *= 10;

      
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   if (timeprev == Time[0]) return;
   timeprev = Time[0];
   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1); 
   op=CalculateProfit();
   cn=CountTrades();
   tp=TakeProfit;
   if (tp>TakeProfit)
   {
      TakeProfit+=tp;
   }
   
 

 
   if (cn==0 && CountBuy() + CountSell() == 0 && Ask > maprice)
   {
      if (OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue)<0)
            Print("Не удалось открыть ордер на покупку");
            
   }
   
   if (cn==0 && CountBuy() + CountSell() == 0 && Bid < maprice)
   {
      if (OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red)<0)
            Print("Не удалось открыть ордер на продажу");
            
   }
   

   
   if(cn==1 && CountBuy()==1) 
   {
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на продажу");
      }
   }
   else if(cn==1 && CountSell()==1) 
   {
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
      }
   }
   
   
   
   if(cn==2 && CountBuy()==1 && CountSell()==1) 
   {
      price=FindLastSellPrice();
      if((price-Bid)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   else if(cn==2 && CountSell()==1 && CountBuy()==1) 
   {
      price=FindLastBuyPrice();
      if((Ask-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   
   Trailing();

   if (op>=tp)
   {
         CloseAll();    
   }


}    
//---------------------------------------------------------------------------------------
void Trailing()           
            {  

               if (op > (TakeProfit+TrailXStep))
               {
                  tp=(TakeProfit+TrailXStep);
               }
               if (op > (TakeProfit+TrailXStep-TrailXStop) && op < (TakeProfit+TrailXStep+TrailXStop))
               {
                  tp=(TakeProfit+TrailXStep-TrailXStop);
               }
               
            }
//---------------------------------------------------------------------------------------
double CalculateProfit()
  {
   double oprofit=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               oprofit+=OrderProfit();
              }
           }
        }
     }
   return(oprofit);
  }
//--------------------------------------------------------------------------------------
void CloseAll()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  Print("Не удалось закрыть ордер на покупку");
              }
            if(OrderType()==OP_SELL)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  Print("Не удалось закрыть ордер на продажу");
              }
           }
        }
     }
  }
//---------------------------------------------------------------------------------------------------
double FindLastBuyPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//---------------------------------------------------------------------------------------------------
double FindLastSellPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//----------------------------------------------------------------------------------------------
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
            count++;
        }
     }
   return(count);
  }
//----------------------------------------------------------------------------------------------
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+---------------------------------------------------------------------------------+
int CountTrades()
{
    int count=0;
    for (int i=OrdersTotal()-1; i>=0; i--)
      {  
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                  count++; 
         }
      }
      return(count);
}
//----------------------------------------------------------------------------------+
int FindLastOrderType()
{
      for(int i = OrdersTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            return(OrderType());
         } 
      }
      return(-1);
}
//----------------------------------------------------------------------------------+

Вот такой сейчас вариант трейлинга по функции CalculateProfit(), в торговле одинаковые показатели у обоих вариантов трейлинга - что по количеству сделок, что по профитам. Профитов немного - теперь буду индикаторы прикручивать - волатильности и на более точный вход. Я думаю один и тот же индикатор может эти задачи решить, да? Скажем который анализирует 5 последних баров или что-то в этом роде. Как такие баровые индикаторы называются подскажите. И какой таймфрейм лучше ? Поделитесь соображениями пожалуйста, как бы мне одним индикатором двух зайцев... того :)

Как советник  трейлит можно здесь глянуть

 
Alexey Viktorov:
Почему не применишь??? Надо не к чужой функции что-то приделывать или придумывать, а свои писать так, чтобы они выполняли всё что ты сам хочешь. Ну в чём может быть проблема? Сколько-бы нибыло ордеров, посчитать среднюю цену и от неё вести трал... При выполнении какого-то условия перебирая в цикле все ордера переставить им стопы на новый уровень который посчитан от средней цены всех имеющихся ордеров одного направления.

Сохранил, спасибо. Я ещё так думать не могу. Это надо библиотеку в голове иметь из кодов и функций а на видеоуроках мы там вот что прошли я то и применяю пока. Там глядишь поднатарею и ваш совет реализую. А вот что я сегодня придумал, это вообще на трал похоже? Не ну советник тралит это видно по отчётам, только насколько это всё корректно опять же не знаю, ведь некорректный трал только усилит вероятность слива, я и так там ищу в настройках тестера значения чтобы советник хоть что-то заработал))) а на реал ему пока рано конечно. Слив с вероятностью 0,9, примерно так))) Он очень флетов боится и индикатор слабенький сейчас - тупо к тренду присоединяемся а когда 3 ордера есть и рынок вдруг меняет направление и даёт просадку - слив. 
 
geratdc:

Сохранил, спасибо. Я ещё так думать не могу. Это надо библиотеку в голове иметь из кодов и функций а на видеоуроках мы там вот что прошли я то и применяю пока. Там глядишь поднатарею и ваш совет реализую. А вот что я сегодня придумал, это вообще на трал похоже? Не ну советник тралит это видно по отчётам, только насколько это всё корректно опять же не знаю, ведь некорректный трал только усилит вероятность слива, я и так там ищу в настройках тестера значения чтобы советник хоть что-то заработал))) а на реал ему пока рано конечно. Слив с вероятностью 0,9, примерно так))) Он очень флетов боится и индикатор слабенький сейчас - тупо к тренду присоединяемся а когда 3 ордера есть и рынок вдруг меняет направление и даёт просадку - слив. 

Ну что-ж, попробую ещё вставить свою лепту в твоё образование.

На вы буду обращаться когда буду посылать. У меня есть снимок указателя...

Скажи пожалуйста, не кажется-ли неправильным вызывать одну функцию 5 раз на одном тике? Но это ещё пол-беды. Эта функция перебирает все ордера. И всё это 5 раз за один тик... А таких функций, я насчитал 4. Это не напрягая мозги как-бы в один цикл пристроить ещё 3 функции с циклом перебора всех ордеров.

Вот две из них.

if (cn==0 && CountBuy() + CountSell() == 0 && Ask > maprice)
if (cn==0 && CountBuy() + CountSell() == 0 && Bid < maprice)
if(cn==1 && CountBuy()==1)


else if(cn==1 && CountSell()==1) 
if(cn==2 && CountBuy()==1 && CountSell()==1) 


else if(cn==2 && CountSell()==1 && CountBuy()==1)

Это

Trailing();


}    
//---------------------------------------------------------------------------------------
void Trailing()           
            {  

               if (op > (TakeProfit+TrailXStep))
               {
                  tp=(TakeProfit+TrailXStep);
               }
               if (op > (TakeProfit+TrailXStep-TrailXStop) && op < (TakeProfit+TrailXStep+TrailXStop))
               {
                  tp=(TakeProfit+TrailXStep-TrailXStop);
               }
               
            }


на трейлинг не похоже даже близко.

Чтобы это понять надо чётко понять определение что такое трейлинг. Дословно не помню, а примерно так "Перемещение уровня StopLoss вслед за ценой с целью уменьшения возможного убытка, или увеличения "гарантированной" прибыли."


А вот это

extern double price,op,cn,tp;

как выглядит при запуске советника? Наверное четыре строки... они нужны?


И последнее на сегодня: Библиотеку в голове иметь не надо. Достаточно иметь документацию и уметь ей пользоваться. Я до сих пор не могу на память записать все параметры iMA(_Symbol, _Period, ,,,,,) и дальше пишу только посмотрев документацию. И так почти все функции. Но к счастью не так давно сделали всплывающие подсказки которые не сильно спасают. Я не пытаюсь запомнить как пишутся те или иные энумы. Так-что в документацию приходится лезть каждый раз.

 

Подскажите пожалуйста, какая функция проверяет состояние этого чекбокса?


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