MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1548

 
SGarnov :

더 쉽게 하기 위해 내 소스 코드를 가져오면 논리가 작동하지만 내가 설명한 문제를 제외하고는 잘 이해되지 않고 머리가 끓어오르지만 의미가 없습니다.

하나 또는 두 개의 다른 방향으로 보류 중인 주문 을 합니까?
 
SGarnov :
그래서 어떤 이유로 그는 자신의 명령을 기억하지 못하고 역사에서 볼 수 없습니다. 코드에 따르면 그래야 하지만 실제로는 보이지 않습니다. 도울 수 있니? 이전에 게시된 소스 코드

@MakarFX는 이미 합니다. 간섭하지 맙시다.

제가 하고 싶은 말.. (개인적으로/개인적으로) 명확하게 모든 것을 작성하고 코드를 복사하여 붙여넣지 마십시오.

고도로 단순화된 로봇 골격은 다음과 같습니다.

int ticket=- 1 ;             // тикет открытого ордера
bool inited= false ;       // признак завершения инициализации

int OnInit ()
{
   ticket=- 1 ;
   inited= false ;
   // ещё надо проверить параметры, но пока чёрт с ними
   // пробуем загрузить прежнее состояние
   if (LoadState()) {
       // из файла, базы или глоб.переменных загрузились
       if (!CheckState()) {
         // проверили, плохо всё..
         ClearState(); // удалить и поругаться
         Alert ( "Усё пропало, шеф !" );
         return INIT_FAILED ();
      }
   }
   return ( INIT_SUCCEEDED );
}
void OnDeinit ( const int reason)
{
   if (inited) {
       // инициализация была проведена, стейт мог уже менятся во время работы
      SaveState(); // сохраняем куда-то там
   }
}

void OnTick ()
{
   //// ЧТОБЫ БЫ БЫЛО ХОРОШО, 
   //// НЕ БОЛЕЕ 1-го ПРИКАЗА Open/Close/Modify на тик
   //// И ЗАВЕРШИТЬ ВСЁ ПО БЫСТРОМУ
   if (!inited) {
       // связь есть, тики идут
       // довести инициализацию до нужной кондиции
       if (!DoInit()) {
         // не довелась
         Alert ( "вот же блин..." );
         ExpertRemove ();
      } else {
         // в DoInit проставлен корректный ticket
         inited= true ;
      }
       return ;
   }
   // всё проиничено, ticket или -1 если нет нифига или реально тикет
   //// РАЗБОРЫ С ТИКЕТАМИ
   if (ticket< 0 ) {
       // нет открытых ордеров
       // может открыть/переоткрыть ?
   } else {
       if (! OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES)) {
         // что-то не так с синхронизацией, просто пропустим тик
         return ;
      }
       if (OrderCloseTime()!= 0 ) {
         // ордер закрылся ручками или по стопам/тейкам (или стопаут, приплыли)
         OnCloseOrder();   // обработать, разобраться
         ticket=- 1 ;         // нет у нас больше тикета..
         // в этот тик больше не успеть
         return ;
      } else {
         if ((OrderStopLoss()== 0 && SL!= 0 ) || (OrderTakeProfit()== 0 && TP!= 0 )) {
             // свежачок - надо ему выстаить Тейк и/или стоп
            
         } else {
             // для реала - проверять сработку Sl/Tp на ГЕПАХ, ЭТО ВАЖНО
         }
      }
   }
   //// РАЗБОРЫ с БАРАМИ
   CheckForOnBar();
   ///  и так далее...
}
void OnTimer ()
{
   // тики завершаем быстро-быстро, поэтому открытия баров дополнительно проверяем по таймеру
   CheckForOnBar();
}

맥주는 놀라운 효과를 내고 사람들을 더 친절하게 만듭니다 :-)

 
MakarFX :
하나 또는 두 개의 다른 방향으로 보류 중인 주문 을 합니까?
나는 항상 보류중인 게시물을 게시합니다
 
SGarnov :
나는 항상 보류중인 게시물을 게시합니다

시도, 질문

 //+------------------------------------------------------------------+
//|                                                   SGarnov.v2.mq4 |
//|                                           Copyright 2020, DrMak. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, DrMak."
#property link        " https://www.mql5.com "
#property version    "1.00"
#property strict
//--- input parameters
input int       T_Profit = 2 ;     // Коэффициент Take Profit
input int       S_Loss   = 200 ;   // Уровень Stop Loss
input double    O_Lots   = 0.01 ;   // Лоты
input int       SL_Count = 2 ;     // Количество убыточных ордеров
input int       Slippage = 30 ;     // Проскальзывание
input int       N_Magic  = 888 ;   // Magic

datetime T_Start;
double sl_price,tp_price,t_profit,s_loss;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---

//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- 
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   t_profit = S_Loss*T_Profit;
   tp_price = NormalizeDouble (t_profit * Point (), Digits )+GetPointLoss();
//---
   s_loss   = MathMax (S_Loss, MarketInfo( _Symbol , MODE_STOPLEVEL));
   sl_price = NormalizeDouble (s_loss * Point (), Digits );

   // Удаляем отложенный ордер после профита
   if (CountOrders(- 1 )== 1 ) DeletePending();
   // Проверяем серию убыточных ордеров
   if (GetLossOrders()<=SL_Count)
     {
       // Устанавливаем отложенный ордер
      SendPending();
     }

   // Проверяем наличие ордеров BUY
   if (CountOrders( 0 )> 0 )
     {
       // Устанавливаем StopLoss/TakeProfit
      ModifyOrder();
     }

   // Проверяем наличие ордеров SELL
   if (CountOrders( 1 )> 0 )
     {
       // Устанавливаем StopLoss/TakeProfit
      ModifyOrder();
     }
  }
//+------------------------------------------------------------------+
//| Модификация ордера                                               |
//+------------------------------------------------------------------+
void ModifyOrder()
  {
   int ticket= 0 ;
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos,SELECT_BY_POS)== true )
        {
         if (OrderSymbol()== _Symbol )
           {
             if (OrderStopLoss()== 0 )
              {
               if (OrderType()==OP_BUY)
                 {
                   if (OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-sl_price, OrderOpenPrice()+tp_price, OrderExpiration()))
                    { Print ( "Ордер модифицирован" );}
                   else
                    { Print ( "Ошибка модификации ордера:" , GetLastError ());}
                 }
               if (OrderType()==OP_SELL)
                 {
                   if (OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+sl_price, OrderOpenPrice()-tp_price, OrderExpiration()))
                    { Print ( "Ордер модифицирован" );}
                   else
                    { Print ( "Ошибка модификации ордера:" , GetLastError ());}
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
//|  0 - ордера типа BUY          1 - ордера типа SELL               |
//|  2 - ордера типа BUYLIMIT     3 - ордера типа SELLLIMIT          |
//|  4 - ордера типа BUYSTOP      5 - ордера типа SELLSTOP           |
//|  6 - ордера типа Balance     -1 - Все типы ордеров               |
//+------------------------------------------------------------------+
int CountOrders( int or_ty=- 1 ) 
  {
   int cnt= 0 ;
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos,SELECT_BY_POS)== true )
        {
         if (OrderSymbol()== _Symbol )
           {
             if (or_ty< 0 || or_ty==OrderType()) cnt++;
           }
        }
     }
   return (cnt);
  }
//+------------------------------------------------------------------+
//| Установка отложенного ордера                                     |
//+------------------------------------------------------------------+
void SendPending()
  {
   double op= 0 ;
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS)== true )
        {
         if (CountOrders(- 1 )== 1 )
           {
             if (OrderType()==OP_BUY)
              {
               if (OrderStopLoss() != 0 )
                 {
                  op=OrderStopLoss();
                   if ( OrderSend ( _Symbol ,OP_SELLSTOP,O_Lots,op,Slippage, 0 , 0 , NULL ,N_Magic))
                    { Print ( "Отложенный ордер установлен" );}
                   else
                    { Print ( "Ошибка установки отложеного одера: " , GetLastError ());}
                 }
              }
             if (OrderType()==OP_SELL)
              {
               if (OrderStopLoss() != 0 )
                 {
                  op=OrderStopLoss();
                   if ( OrderSend ( _Symbol ,OP_BUYSTOP,O_Lots,op,Slippage, 0 , 0 , NULL ,N_Magic))
                    { Print ( "Отложенный ордер установлен" );}
                   else
                    { Print ( "Ошибка установки отложеного одера: " , GetLastError ());}
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Удаление отложенного ордера                                      |
//+------------------------------------------------------------------+
void DeletePending()
  {
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS)== true )
        {
         if (CountOrders(- 1 )== 1 )
           {
             if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
              {
               if (OrderMagicNumber() == N_Magic)
                 {
                   if (OrderDelete(OrderTicket()))
                    { Print ( "Отложенный ордер удален" );}
                   else
                    { Print ( "Ошибка удаления отложеного одера: " , GetLastError ());}
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Возвращает время начала цикла                                    |
//+------------------------------------------------------------------+
datetime TimeStart()
  {
   datetime ts= 0 ;
   if ( OrdersTotal ()!= 0 )
     {
       for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
        {
         if ( OrderSelect (pos,SELECT_BY_POS)== true )
           {
             if (OrderSymbol()== _Symbol )
              {
               if (OrderMagicNumber()!=N_Magic)
                 {
                  ts=OrderOpenTime();
                 }
              }
           }
        }
     }
   else
   if ( OrdersTotal ()== 0 )
     {
       for ( int pos= 0 ; pos<OrdersHistoryTotal(); pos++)
        {
         if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
           {
             if (OrderSymbol()== _Symbol )
              {
               if (OrderType()==OP_BUY || OrderType()==OP_SELL)
                 {
                   if (OrderProfit()> 0 )
                    {
                     if (ts<OrderCloseTime())
                       {
                        ts=OrderCloseTime();
                       }
                    }
                 }
              }
           }
        }
     }
   return (ts);
  }
//+------------------------------------------------------------------+
//|  Возвращает пункты убытка закрытых ордеров с начала цикла        |
//+------------------------------------------------------------------+
double GetPointLoss()
  {
   double result= 0 ,b= 0 ,s= 0 ;;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if ((OrderSymbol()== _Symbol ))
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (OrderProfit()< 0 )
                 {
                   if (OrderCloseTime()>TimeStart())
                    {
                     if (OrderType()==OP_BUY&&OrderProfit()< 0 )
                       {
                        b+=OrderOpenPrice()-OrderClosePrice();
                       }
                     if (OrderType()==OP_SELL&&OrderProfit()< 0 )
                       {
                        s+=OrderClosePrice()-OrderOpenPrice();
                       }
                    }
                 }
              }
           }
        }
     }
   return (b+s);
  }
//+------------------------------------------------------------------+
//|  Возвращает кол-во серии убыточных ордеров                       |
//+------------------------------------------------------------------+
int GetLossOrders()
  {
   int cnt= 0 ;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if ((OrderSymbol()== _Symbol ))
           {
             if (OrderCloseTime()>TimeStart())
              {
               if (OrderProfit()< 0 ) cnt++;
              }
           }
        }
     }
   return (cnt);
  }
//+------------------------------------------------------------------+
 
MakarFX :

시도, 질문

런칭. 구독 취소 도와 주셔서 감사합니다.
 
SGarnov :
런칭. 구독 취소 도와 주셔서 감사합니다.

누군가이 행동의 이유를 설명 할 수 있습니까?

주문을 엽니다

2021.07.29 18:53:57.436 '60744458': order was opened : #1639674290 sell 0.01 USDJPY at 109.519 sl: 0.000 tp: 0.000

그런 다음 고문이 수정합니다.

2021.07.29 18:53:57.647 '60744458': modify order #1639674290 sell 0.01 USDJPY at 109.519 sl: 0.000 tp: 0.000 -> sl: 109.919 tp: 108.719

그리고 이 헛소리

2021.07.29 18:53:58.313 '60744458': order #1639674290 sell 0.01 USDJPY closing at 0.000 failed [Off quotes]
2021.07.29 18:53:57.647 '60744458': close order #1639674290 sell 0.01 USDJPY at 109.519 sl: 0.000 tp: 0.000 at price 0.000

가장 흥미로운 점은 이것이 USDJPY 쌍에서 발생하고 다른 사람에서만 판매된다는 것입니다.

 
MakarFX :

누군가이 행동의 이유를 설명 할 수 있습니까?

주문을 엽니다

그런 다음 고문이 수정합니다.

그리고 이 헛소리

가장 흥미로운 점은 이것이 USDJPY 쌍에서 발생하고 다른 사람에서만 판매된다는 것입니다.

무언가를 이해하려면 최소한의 주기로 유용한 정보를 최대한 끌어내는 법을 배우십시오 ...

 
Alexey Viktorov :

무언가를 이해하려면 최소한의 주기로 유용한 정보를 최대한 끌어내는 법을 배우십시오 ...

할줄알았을때 얘기하는게 좋은데..

"최대한 유용한 정보를 끌어내는" 방법에 대한 조언을 돕습니다.

 
MakarFX :

누군가이 행동의 이유를 설명 할 수 있습니까?

주문을 엽니다

그런 다음 고문이 수정합니다.

그리고 이 헛소리

가장 흥미로운 점은 이것이 USDJPY 쌍에서 발생하고 다른 사람에서만 판매된다는 것입니다.

코드가 작성된 고문이 작동하는 방식입니까, 아니면 다른 고문입니까?
 
SGarnov :
코드가 작성된 고문이 작동하는 방식입니까, 아니면 다른 고문입니까?
다 좋은데 문제는 단말기였다.