Делимся интересными кодами! Не жадничаем!))

 

Может кому пригодится... Сегодня писал такую штуку: надо было выставить отложку через определенное время после срабатывания стоп лосса. Вот что получилось:

   if(TradeAfterSLB&&LastLossLot()!=0)
   {
      TimeToStruct(TimeCurrent(),Str1);
      TimeToStruct(TimeClose(),Str2);
      TimeToStruct(StrToTime(TimeAfterB),Str3);
      
      if(TypeOrder()==OP_BUY)
      {
         if(CountOrders(OP_BUYSTOP)==0)
         {
            if((Str2.min+Str3.min)<60)
            {
               if((Str2.hour+Str3.hour)==Str1.hour&&(Str2.min+Str3.min)==Str1.min)
               {
                  OpenOrder(OP_BUYSTOP);
                  pB=1;
               }
            }
            else
            {
               if((Str2.hour+Str3.hour+1)==Str1.hour&&(Str2.min+Str3.min-60)==Str1.min)
               {
                  OpenOrder(OP_BUYSTOP);
                  pB=1;
               }
            }
         }
      }
   }
   
   if(TradeAfterSLS&&LastLossLot()!=0)
   {
      TimeToStruct(TimeCurrent(),Str1);
      TimeToStruct(TimeClose(),Str2);
      TimeToStruct(StrToTime(TimeAfterS),Str4);
      
      if(TypeOrder()==OP_SELL)
      {
         if(CountOrders(OP_SELLSTOP)==0)
         {
            if((Str2.min+Str4.min)<60)
            {
               if((Str2.hour+Str4.hour)==Str1.hour&&(Str2.min+Str4.min)==Str1.min)
               {
                  OpenOrder(OP_SELLSTOP);
                  pS=1;
               }
            }
            else
            {
               if((Str2.hour+Str4.hour+1)==Str1.hour&&(Str2.min+Str4.min-60)==Str1.min)
               {
                  OpenOrder(OP_SELLSTOP);
                  pS=1;
               }
            }
         }
      }
   }

Получилось довольно забавно!)) Делал для бай и селл отдельно поэтому немного шире получилось...

Общие принципы - Торговые операции - Справка по MetaTrader 5
Общие принципы - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 
Maksim Neimerik:

Сегодня писал такую штуку: надо было выставить отложку через определенное время после срабатывания стоп лосса. Вот что получилось:

Получилось довольно забавно!)) Делал для бай и селл отдельно поэтому немного шире получилось...

Код "тяжёлый" - много лишних вызовов, которые можно сделать в одном цикле с использованием структур.

TimeToStruct(TimeClose(),Str2);
      TimeToStruct(StrToTime(TimeAfterS),Str4);
      
      if(TypeOrder()==OP_SELL)
      {
         if(CountOrders(OP_SELLSTOP)==0)

В общем, сейчас так писать коды не есть хорошо, язык развит для более рационального использования ресурсов машины и быстродействия отработки программы. ИМХО

 

до редактирования "очепятки" в заголовке, тема выглядела лучше.

Делимся интересными ходами! Не жадничаем!))


перспективнее :-)

 
Maksim Neimerik:

Может кому пригодится... Сегодня писал такую штуку: надо было выставить отложку через определенное время после срабатывания стоп лосса. Вот что получилось:

Получилось довольно забавно!)) Делал для бай и селл отдельно поэтому немного шире получилось...

И да, был у меня постоянный заказчик, писали обычные советники и индикаторы, потом он дал задание на сложный советник, так Я вот там в таком-же стиле и написал программу, работала по алгоритму, но раздутая получилась, код не красивый, плюс ко всему тяжёлый - тестер захлёбывался. Это было наверное в 2016 году. Когда отдавал исходник, то было немного стыдно за такой код.

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

После сдачи той работы понял, что писать программы в стиле 2000-х годов не есть хорошо.

********************************

Используйте структуры и классы с одним вызовом цикла, вместо вызова десятка функций с циклом for(...) для получения информации.

 

Если эксперт выполняет действия и нужно вывести на график инфу по ним, то можно воспользоваться моим Списком событий

//+------------------------------------------------------------------+
//|                                Copyright 2019, Vladimir V. Tkach |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Владимир В. Ткач"
#property description ""
#property link      "https://www.mql5.com/ru/users/net/news"
#property strict

int cnt=0;
string
str[18];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);

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

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---

   Event((string)cnt++);

   Comment("Some constant comment","\n",
   " ","\n",
   "Events list","\n",
   str[0],"\n",
           str[1],"\n",
           str[2],"\n",
           str[3],"\n",
           str[4],"\n",
           str[5],"\n",
           str[6],"\n",
           str[7],"\n",
           str[8],"\n",
           str[9],"\n",
           str[10],"\n",
           str[11],"\n",
           str[12]
          );

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Event(string str_)
  {
   if(IsTesting()==true)
      return;

   string x1="",x2="";
   if(StringLen((string)Hour())==1)
      x1="0";
   if(StringLen((string)Minute())==1)
      x2="0";

   str_=(string)Day()+" "+x1+(string)Hour()+":"+x2+(string)Minute()+" "+str_;

   for(int i=0; i<18; i++)
     {
      if(str_==str[i])
         return;
     }

   for(int i=16; i>-1; i--)
     {
      str[i+1]=str[i];
     }

   str[0]=str_;
   return;
  }
//+------------------------------------------------------------------+


Будет выглядеть так


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