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

 
MakarFX :

강조 표시됨...<0이면 손실 거래가 많이 증가합니다.

>0이면 수익성 있는 거래가 많이 증가합니다.

여보세요.

귀하의 고문에 대한 또 다른 질문이 있었습니다.

데모에서 테스트할 때 다음과 같은 일이 발생했습니다.

지정된 매개 변수에 도달하면 고문은 "중지"모드로 전환합니다. 즉, "시작"버튼이 켜져 있지만 동시에 거래가 중지되지 않았지만 문자 그대로 하나 또는 두 개의 매우 짧은 거래가 있습니다. 센트. 그렇게 의도된 것인가?

나는 또한 고문이 테이크나 스탑이 아니라 금액 한도가 아니라 "그대로" 가격이 마감 순간까지 다른 수의 포인트를 통과하는 동안 많은 거래를 마감했다는 것을 발견했습니다. 동시에, 고문은 이전 손실을 몇 센트로 완전히 보상합니다.

로그를 보니 에러가 안나네요...

 
законопослушный гражданин :

여보세요.

귀하의 고문에 대한 또 다른 질문이 있었습니다.

데모에서 테스트할 때 다음과 같은 일이 발생했습니다.

지정된 매개 변수에 도달하면 고문은 "중지"모드로 전환합니다. 즉, "시작"버튼이 켜져 있지만 동시에 거래가 중지되지 않았지만 문자 그대로 하나 또는 두 개의 매우 짧은 거래가 있습니다. 센트. 그렇게 의도된 것인가?

나는 또한 고문이 테이크나 스탑이 아니라 금액 한도가 아니라 "그대로" 가격이 마감 순간까지 다른 수의 포인트를 통과하는 동안 많은 거래를 마감했다는 것을 발견했습니다. 동시에, 고문은 이전 손실을 몇 센트로 완전히 보상합니다.

로그를 보니 에러가 안나네요...

수정 사항과 함께 코드를 게시하십시오. 우리는 볼 것이다.

 
MakarFX :

수정 사항과 함께 코드를 게시하십시오. 우리는 볼 것이다.

그래서 나는 여전히 수정되지 않은 것을 테스트하고 있습니다.

 //+------------------------------------------------------------------+
//|                                                 Citizen.v2.1.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 ENUM_TIMEFRAMES    timeframe_RSI  = PERIOD_H1 ;
input int                period_RSI     = 14 ;
input int                level_buy      = 30 ;
input int                level_sell     = 70 ;
input double             Lot            = 0.1 ;   // Размер стартового лота
input double             K_Martin       = 2.0 ;   // Размер увеличения лота(Мартин) 
input int                Stoploss       = 100 ;   // Размер StopLoss в пунктах
input int                Takeprofit     = 500 ;   // Размер TakeProfit в пунктах
input double             CountLoss      = 200 ;   // Размер максимального убытка
input double             CountProfit    = 300 ;   // Размер минимального профита
input int                Magic          = 777 ;   // Магик
input int                DigitsLot      = 2 ;     // Шаг лота
input int                slippage       = 3 ;     // Проскальзывание
//---
string AC;
datetime Start;
double AB,MINLOT,MAXLOT,RSI1,RSI0,SL,TP,sl,tp;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- create timer
   ObjectsDeleteAll ( 0 , "lab_" );
   EventSetMillisecondTimer ( 500 );
   Start  = TimeCurrent ();
   MINLOT = MarketInfo( Symbol (),MODE_MINLOT);
   MAXLOT = MarketInfo( Symbol (),MODE_MAXLOT);
   AC     = StringConcatenate ( " " , AccountCurrency());
   AB     = AccountInfoDouble ( ACCOUNT_BALANCE );
   int Y= 20 ;
   CreateButton( 0 , "lab_Button" , 0 , 79 ,Y, 77 , 25 , CORNER_RIGHT_UPPER , "Советник остановлен" , "START" , "Arial Black" , 10 , clrWhite , clrGreen ,
   false , false , false , false , false , 0 );Y += 25 ;
   DrawLABEL( "lab_Торговля"    , 1 , 5 ,Y, clrRed , "Торговля " );Y += 20 ;
   DrawLABEL( "lab_Start Time" , 1 , 5 ,Y, clrGreen , StringConcatenate ( "Start Time: " ,TimeToStr(Start, TIME_DATE | TIME_SECONDS )));Y += 15 ;
   DrawLABEL( "lab_Current Lot" , 1 , 5 ,Y, clrGreen , StringConcatenate ( "Current Lot: " ,DoubleToStr(Lots(),DigitsLot)));Y += 15 ;
   DrawLABEL( "lab_Balance"     , 1 , 5 ,Y, clrGreen , StringConcatenate ( "Balance: " ,DoubleToStr(AccountBalance(), 2 ),AC));Y += 15 ;
   DrawLABEL( "lab_Equity"      , 1 , 5 ,Y, clrGreen , StringConcatenate ( "Equity: " ,DoubleToStr(AccountEquity(), 2 ),AC));Y += 15 ;
   DrawLABEL( "lab_FreeMargin" , 1 , 5 ,Y, clrGreen , StringConcatenate ( "FreeMargin: " ,DoubleToStr(AccountFreeMargin(), 2 ),AC));Y += 30 ;
   DrawLABEL( "lab_Take"        , 1 , 5 ,Y, clrLime , "Profit: " );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   EventKillTimer ();
   if (!IsTesting()) 
     {
       ObjectsDeleteAll ( 0 , "lab_" );
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   if (IsTesting()) 
     {
       if ( ObjectGetInteger ( 0 , "lab_Button" , OBJPROP_STATE )== true )
        {
         ObjectSetInteger ( 0 , "lab_Button" , OBJPROP_BGCOLOR , clrRed );
         ObjectSetString ( 0 , "lab_Button" , OBJPROP_TOOLTIP , "Советник запущен" );
         ObjectSetString ( 0 , "lab_Button" , OBJPROP_TEXT , "STOP" );
        }
       if ( ObjectGetInteger ( 0 , "lab_Button" , OBJPROP_STATE )== false )
        {
         ObjectSetInteger ( 0 , "lab_Button" , OBJPROP_BGCOLOR , clrGreen );
         ObjectSetString ( 0 , "lab_Button" , OBJPROP_TOOLTIP , "Советник остановлен" );
         ObjectSetString ( 0 , "lab_Button" , OBJPROP_TEXT , "START" );
         Start = iTime ( _Symbol , PERIOD_D1 , 0 );
        }
     }
   if (GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*- 1 )
     {
       if (IsTesting()) 
        {
         CloseOrder(); ObjectSetInteger ( 0 , "lab_Button" , OBJPROP_STATE , false );
        }
       else
        {
         CloseOrder();
        }
     }
   // Обновляем текст на лейблах
   DrawLABEL( "lab_Start Time" , 1 , 5 , 0 , clrGreen , StringConcatenate ( "Start Time: " ,TimeToStr(Start, TIME_DATE | TIME_SECONDS )));
   DrawLABEL( "lab_Current Lot" , 1 , 5 , 0 , clrGreen , StringConcatenate ( "Current Lot: " ,DoubleToStr(Lots(),DigitsLot)));
   DrawLABEL( "lab_Balance"     , 1 , 5 , 0 , clrGreen , StringConcatenate ( "Balance: " ,DoubleToStr(AB, 2 ),AC));
   DrawLABEL( "lab_Equity"      , 1 , 5 , 0 , clrGreen , StringConcatenate ( "Equity: " ,DoubleToStr(AccountEquity(), 2 ),AC));
   DrawLABEL( "lab_FreeMargin" , 1 , 5 , 0 , clrGreen , StringConcatenate ( "FreeMargin: " ,DoubleToStr(AccountFreeMargin(), 2 ),AC));
   DrawLABEL( "lab_Take"        , 1 , 5 , 0 ,Color(GetProfitFromStart()> 0 ,Lime,Red), StringConcatenate ( "Profit: " ,DoubleToStr(GetProfitFromStart(), 2 ),AC));
   //---
   sl  = MathMax (Stoploss, MarketInfo( _Symbol , MODE_STOPLEVEL)) * Point ();
   SL  = NormalizeDouble (sl* Point (), Digits );
   tp  = MathMax (Takeprofit, MarketInfo( _Symbol , MODE_STOPLEVEL)) * Point ();
   TP  = NormalizeDouble (tp* Point (), Digits );
   //---
   if (CountOrders()== 0 && ObjectGetInteger ( 0 , "lab_Button" , OBJPROP_STATE ))
     {
       if (TradeSignal()>= 0 )
        {
         SendOrder(TradeSignal());
        }
     }
   //---
   if (!IsTradeAllowed()) 
     {DrawLABEL( "lab_Торговля" , 0 , 0 , 0 , clrRed , "Торговля запрещена" ); return ;} 
   else
     {DrawLABEL( "lab_Торговля" , 0 , 0 , 0 , clrLime , "Торговля разрешена" );}
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Сигнал для открытия ордера                                       |
//+------------------------------------------------------------------+
int TradeSignal() 
  {
   int sig=- 1 ;
   // Здесь расчет сигнала
   RSI0= iRSI ( NULL ,timeframe_RSI,period_RSI, PRICE_CLOSE , 0 );
   RSI1= iRSI ( NULL ,timeframe_RSI,period_RSI, PRICE_CLOSE , 1 );
   // Здесь определение направления сигнала sig=0-BUY, sig=1-SELL
   if (RSI0>=level_buy && RSI1<=level_buy)   sig= 0 ;
   if (RSI0<=level_sell && RSI1>=level_sell) sig= 1 ;
   return (sig);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam)
  {
//---
   if (sparam== "lab_Button" ) TradeButton();
  }
//+--------------------------------------------------------------------------------------------------------------------+
//| ButtonSTART                                                                                                        |
//+--------------------------------------------------------------------------------------------------------------------+
void TradeButton()
  {
   if ( ObjectGetInteger ( 0 , "lab_Button" , OBJPROP_STATE )== true )
     {
       ObjectSetInteger ( 0 , "lab_Button" , OBJPROP_BGCOLOR , clrRed );
       ObjectSetString ( 0 , "lab_Button" , OBJPROP_TOOLTIP , "Советник запущен" );
       ObjectSetString ( 0 , "lab_Button" , OBJPROP_TEXT , "STOP" );
     }
   if ( ObjectGetInteger ( 0 , "lab_Button" , OBJPROP_STATE )== false )
     {
       ObjectSetInteger ( 0 , "lab_Button" , OBJPROP_BGCOLOR , clrGreen );
       ObjectSetString ( 0 , "lab_Button" , OBJPROP_TOOLTIP , "Советник остановлен" );
       ObjectSetString ( 0 , "lab_Button" , OBJPROP_TEXT , "START" );
      Start = TimeCurrent ();
     }
  }
//+------------------------------------------------------------------+
//| Расчет лота                                                      |
//+------------------------------------------------------------------+
double Lots()
  {
   double L= 0 ;
   if (GetInfoLastPos( 3 )>Start && GetInfoLastPos( 2 )< 0 )
     {L= NormalizeDouble (GetInfoLastPos( 1 )*K_Martin,DigitsLot);}
   else
     {L=Lot;}
   
   if (L>MAXLOT) L = MAXLOT;
   if (L<MINLOT) L = MINLOT;
   return (L);
  }
//+----------------------------------------------------------------------------+
//|  Функция возвращает по символу и магику                                    |
//|  размер профита с учетом комиссии и свопа с начала цикла                   |
//+----------------------------------------------------------------------------+
double GetProfitFromStart()
  {
   double lp= 0 ,cp= 0 ;
   for ( int i= 0 ; i<OrdersHistoryTotal(); i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (Start<OrderCloseTime()) {lp+=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL) {cp=OrderProfit()+OrderCommission()+OrderSwap();}
           }
        }
     }
   return (lp+cp);
  }
//+----------------------------------------------------------------------------+
//|  Функция возвращает по символу и магику                                    |
//|  1 - размер лота последней закрытой позиции                                |
//|  2 - размер профита с учетом комиссии и свопа последней закрытой позиции   |
//|  3 - время последней закрытой позиции                                      |
//+----------------------------------------------------------------------------+
double GetInfoLastPos( int a= 1 )
  {
   datetime t= 0 ;
   double result= 0 ,l= 0 ,p= 0 ,f= 0 ;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime()) {t=OrderCloseTime(); l=OrderLots(); p=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   if (a== 1 ) {result=l;} else
   if (a== 2 ) {result=p;} else
   if (a== 3 ) {result=( double )t;}
   else      {result= 0 ;}
   return (result);
  }
//+------------------------------------------------------------------+
//| Подсчет открытых ордеров                                         |
//+------------------------------------------------------------------+
int CountOrders() 
  {
   int cnt= 0 ;
   int i= OrdersTotal ()- 1 ;
   for ( int pos=i;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol()== _Symbol )
           {
             if (OrderMagicNumber()==Magic) cnt++;
           }
        }
     }
   return (cnt);
  }
//+------------------------------------------------------------------+
//| Открытие ордера                                                  |
//+------------------------------------------------------------------+
void SendOrder( int so= 0 ) 
  {
   if (so== 0 )
     {
       if ( OrderSend ( Symbol (),OP_BUY, Lots(),Ask,slippage,Ask-sl,Ask+tp, NULL ,Magic, 0 , clrBlue ))
        { Print ( "Open Buy: " , _Symbol );} else { Print ( "Error Open Buy: " , _Symbol , " / " , GetLastError ());}
     }
   if (so== 1 )
     {
       if ( OrderSend ( Symbol (),OP_SELL, Lots(),Bid,slippage,Bid+sl,Bid-tp, NULL ,Magic, 0 , clrBlue ))
        { Print ( "Open Sell: " , _Symbol );} else { Print ( "Error Open Sell: " , _Symbol , " / " , GetLastError ());}
     }
  }
//+------------------------------------------------------------------+
//| Закрытие открытого ордера                                        |
//+------------------------------------------------------------------+
void CloseOrder() 
  {
   int i= OrdersTotal ()- 1 ;
   for ( int pos=i;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY)
              {
               if (OrderClose(OrderTicket(),OrderLots(),Bid,slippage, clrBlue )) TradeButton();
              }
             if (OrderType()==OP_SELL)
              {
               if (OrderClose(OrderTicket(),OrderLots(),Ask,slippage, clrRed )) TradeButton();
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Установка цвета                                                  |
//+------------------------------------------------------------------+
color Color( bool P, color a, color b)
  {
   if (P) return (a);
   else return (b);
  }
//+------------------------------------------------------------------+
//| Установка лейблов/текста                                         |
//+------------------------------------------------------------------+
void DrawLABEL( string name, int CORNER, int X, int Y, color clr, string Name)
  {
   if ( ObjectFind ( 0 ,name)!= 0 )
     {
       ObjectCreate ( 0 ,name, OBJ_LABEL , 0 , 0 , 0 );
      ObjectSet(name, OBJPROP_CORNER , CORNER);
      ObjectSet(name, OBJPROP_XDISTANCE , X);
      ObjectSet(name, OBJPROP_YDISTANCE , Y);
     }
   ObjectSetText(name,Name, 10 , "Arial" ,clr);
  }
//+--------------------------------------------------------------------------------------------------------------------+
//| Создает кнопку                                                                                                     |
//+--------------------------------------------------------------------------------------------------------------------+
bool CreateButton( const long               chart_ID= 0 ,               // ID графика
                   const string             name= "Button" ,             // имя кнопки
                   const int                sub_window= 0 ,             // номер подокна
                   const int                x= 0 ,                       // координата по оси X
                   const int                y= 0 ,                       // координата по оси Y
                   const int                width= 50 ,                 // ширина кнопки
                   const int                height= 18 ,                 // высота кнопки
                   const int                corner= 0 ,                 // угол графика для привязки
                   const string             tool= "TOOLTIP" ,           // TOOLTIP
                   const string             text= "Button" ,             // текст
                   const string             font= "Arial" ,             // шрифт
                   const int                font_size= 10 ,             // размер шрифта
                   const color              clr= clrBlack ,             // цвет текста
                   const color              back_clr= C'236,233,216' ,   // цвет фона
                   const bool               state= false ,               // нажата/отжата
                   const bool               back= false ,               // на заднем плане
                   const bool               selection= false ,           // выделить для перемещений
                   const bool               selected= false ,           // выделить для перемещений
                   const bool               hidden= true ,               // скрыт в списке объектов
                   const long               z_order= 0 )                 // приоритет на нажатие мышью
  {
//--- сбросим значение ошибки
   ResetLastError ();
//--- создадим кнопку
   if (! ObjectCreate (chart_ID,name, OBJ_BUTTON ,sub_window, 0 , 0 ))
     {
       Print ( __FUNCTION__ , ": не удалось создать кнопку! Код ошибки = " , GetLastError ()); return ( false );
     }
   ObjectSetInteger (chart_ID,name, OBJPROP_XDISTANCE ,x);
   ObjectSetInteger (chart_ID,name, OBJPROP_YDISTANCE ,y);
   ObjectSetInteger (chart_ID,name, OBJPROP_XSIZE ,width);
   ObjectSetInteger (chart_ID,name, OBJPROP_YSIZE ,height);
   ObjectSetInteger (chart_ID,name, OBJPROP_CORNER ,corner);
   ObjectSetString (chart_ID,name, OBJPROP_TOOLTIP ,tool);
   ObjectSetString (chart_ID,name, OBJPROP_TEXT ,text);
   ObjectSetString (chart_ID,name, OBJPROP_FONT ,font);
   ObjectSetInteger (chart_ID,name, OBJPROP_FONTSIZE ,font_size);
   ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
   ObjectSetInteger (chart_ID,name, OBJPROP_BGCOLOR ,back_clr);
   ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
   ObjectSetInteger (chart_ID,name, OBJPROP_STATE ,state);
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selected);
   ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
   ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
//--- успешное выполнение
   return ( true );
  }
//+------------------------------------------------------------------+
 
законопослушный гражданин :

그래서 나는 여전히 수정되지 않은 것을 테스트하고 있습니다.

오류가 안보이네요...

어떤 기간, 어떤 쌍에 오류가 발생했을 때 매개 변수가 무엇인지 쓰십시오.

 
MakarFX :

오류가 안보이네요...

어떤 기간, 어떤 쌍에 오류가 발생했을 때 매개 변수가 무엇인지 쓰십시오.

설정은 다음과 같습니다.

timeframe_RSI=0 period_RSI=14 level_buy=30 level_sell=70 Lot=0.01 K_Martin=1.6 Stoploss=200 Takeprofit=1000 CountLoss=100.0 CountProfit=25.0 Magic=777 DigitsLot=2 slippage=3

보고서는 아래에 첨부되어 있습니다.

거기에서 나는 "이해할 수 없는" 마감 이 있는 줄을 노란색으로 강조 표시했습니다 . stop, take, money도 아닙니다.

파란색 - 거의 즉시 열리고 닫힌 거래

파일:
v4a73y05.jpg  312 kb
f9o3ssd3.png  92 kb
 

안녕하세요!

이 간단한 어드바이저에 어떤 기능과 어디에 추가해야 하는지 알려주세요.

로트를 초기 로트로 재설정하는 기존의 방법 외에도

예금 통화에 지정된 현재 포지션에 대한 드로우다운에 도달하면 현재 포지션을 청산하고 다음 포지션을 열 때 로트를 시작 통화로 재설정할 수 있습니까?

 //+-----------------------------------------------------------------------------------------------+
//|                                                                     Simple Moving Average.mq4 |
//|                                                                 Copyright 2016, Andrey Minaev |
//|                                                     https://www.mql5.com/ru/users/id.scorpion |
//+-----------------------------------------------------------------------------------------------+
#property copyright "Copyright 2016, Andrey Minaev"
#property link        " https://www.mql5.com/ru/users/id.scorpion "
#property version    "1.00"
#property strict

// Параметры советника
extern string sParametersEA = "" ;     // Параметры советника
extern double dLots         = 0.01 ;   // Количество лотов
extern int     iStopLoss     = 30 ;     // Уровень убытка (в пунктах)
extern int     iTakeProfit   = 30 ;     // Уровень прибыли (в пунктах)
extern int     iSlippage     = 3 ;       // Проскальзование (в пунктах)
extern int     iMagic        = 1 ;       // Индентификатор советника
extern double K_Martin     = 2.0 ;
extern int     OrdersClose  = 5 ;
extern int     DigitsLot    = 2 ;
// Параметры индикатора
extern string sParametersMA = "" ;     // Параметры индикатора
extern int     iPeriodMA     = 14 ;     // Период усреднения
// Глобальные переменные
double dMA;
//+-----------------------------------------------------------------------------------------------+
int OnInit ()
  {
// Если брокер использует 3 или 5 знаков после запятой, то умножаем на 10
   if ( Digits == 3 || Digits == 5 )
     {
      iStopLoss   *= 10 ;
      iTakeProfit *= 10 ;
      iSlippage   *= 10 ;
     }

   return ( INIT_SUCCEEDED );
  }
//+-----------------------------------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {

  }
//+-----------------------------------------------------------------------------------------------+
void OnTick ()
  {
// Получим значение индикатора
   dMA = iMA ( Symbol (), 0 , iPeriodMA, 0 , MODE_SMA , PRICE_CLOSE , 0 );

// Если нет открытых ордеров, то входим в условие
   if (bCheckOrders() == true )
     {
       // Если появился сигнал на покупку, то откроем ордер на покупку
       if (bSignalBuy() == true )
         vOrderOpenBuy();

       // Если появился сигнал на продажу, то откроем ордер на продажу
       if (bSignalSell() == true )
         vOrderOpenSell();
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
bool bCheckOrders()
  {
// Переберем в цикле ордера, для проверки открытых ордеров данным советником
   for ( int i = 0 ; i <= OrdersTotal (); i++)
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == iMagic)
             return ( false );

   return ( true );
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на покупку |
//+-----------------------------------------------------------------------------------------------+
bool bSignalBuy()
  {
   if (dMA > Open[ 1 ] && dMA < Close[ 1 ])
       return ( true );

   return ( false );
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
  {
   if (dMA < Open[ 1 ] && dMA > Close[ 1 ])
       return ( true );

   return ( false );
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на покупку |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenBuy()
  {
   int iOTi = 0 ;   // Тикет ордера

   iOTi = OrderSend ( Symbol (), OP_BUY, LOT(), Ask, iSlippage, 0 , 0 , "" , iMagic, 0 , clrNONE );

// Проверим открылся ли ордер
   if (iOTi > 0 )
       // Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
       // Если нет, то получим ошибку
      vError( GetLastError ());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на продажу |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenSell()
  {
   int iOTi = 0 ;   // Тикет ордера

   iOTi = OrderSend ( Symbol (), OP_SELL, LOT(), Bid, iSlippage, 0 , 0 , "" , iMagic, 0 , clrNONE );

// Проверим открылся ли ордер
   if (iOTi > 0 )
       // Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
       // Если нет, то получим ошибку
      vError( GetLastError ());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                    Функция модификации ордера |
//+-----------------------------------------------------------------------------------------------+
void vOrderModify( int iOTi)
  {
   int     iOTy = - 1 ;   // Тип ордера
   double dOOP = 0 ;     // Цена открытия ордера
   double dOSL = 0 ;     // Стоп Лосс
   int     iMag = 0 ;     // Идентификатор советника

   double dSL = 0 ;     // Уровень убытка
   double dTP = 0 ;     // Уровень прибыли

// Выберем по тикету открытый ордер, получим некоторые значения
   if ( OrderSelect (iOTi, SELECT_BY_TICKET, MODE_TRADES))
     {
      iOTy = OrderType();
      dOOP = OrderOpenPrice();
      dOSL = OrderStopLoss();
      iMag = OrderMagicNumber();
     }

// Если ордер открыл данный советник, то входим в условие
   if (OrderSymbol() == Symbol () && OrderMagicNumber() == iMag)
     {
       // Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордер
       if (dOSL == 0 )
        {
         if (iOTy == OP_BUY)
           {
            dSL = NormalizeDouble (dOOP - iStopLoss * Point , Digits );
            dTP = NormalizeDouble (dOOP + iTakeProfit * Point , Digits );

             bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0 , clrNONE );
           }

         if (iOTy == OP_SELL)
           {
            dSL = NormalizeDouble (dOOP + iStopLoss * Point , Digits );
            dTP = NormalizeDouble (dOOP - iTakeProfit * Point , Digits );

             bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0 , clrNONE );
           }
        }
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                      Функция обработки ошибок |
//+-----------------------------------------------------------------------------------------------+
void vError( int iErr)
  {
   switch (iErr)
     {
       case 129 :   // Неправильная цена
       case 135 :   // Цена изменилась
       case 136 :   // Нет цен
       case 138 :   // Новые цены
         Sleep ( 1000 );
         RefreshRates();
         break ;

       case 137 :   // Брокер занят
       case 146 :   // Подсистема торговли занята
         Sleep ( 3000 );
         RefreshRates();
         break ;
     }
  }
//+-----------------------------------------------------------------------------------------------+

double LOT()
{
   int n= 0 ;
   double OL=dLots;
   for ( int j = OrdersHistoryTotal()- 1 ; j >= 0 ; j--)
   {
       if ( OrderSelect (j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == iMagic)
         {
             if (OrderProfit()< 0 ) 
            {
               if (n== 0 ) OL= NormalizeDouble (OrderLots()*K_Martin,DigitsLot);
               n++;
               if (n>=OrdersClose) { Comment ( "1" ); return (dLots);}
            }
             else
            {
               if (n== 0 ) { Comment ( "2" ); return (dLots);}
               else { Comment ( "3" ); return (OL);}
            }
         }
      }
   }
   return (OL);
}
//------------------------------------------------------------------


 
законопослушный гражданин :

설정은 다음과 같습니다.

timeframe_RSI=0 period_RSI=14 level_buy=30 level_sell=70 Lot=0.01 K_Martin=1.6 Stoploss=200 Takeprofit=1000 CountLoss=100.0 CountProfit=25.0 Magic=777 DigitsLot=2 slippage=3

보고서는 아래에 첨부되어 있습니다.

거기에서 나는 "이해할 수 없는" 마감이 있는 줄을 노란색으로 강조 표시했습니다 . stop, take, money도 아닙니다.

파란색 - 거의 즉시 열리고 닫힌 거래

몇시에?

 
여러분, 조언 감사합니다. 이렇게 작동하게 만들었습니다. 손절하거나 이익을 얻을 때 말합니다.
 //--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if (type== TRADE_TRANSACTION_DEAL_ADD )
     {
       long      deal_entry        = 0 ;
       double    deal_profit       = 0.0 ;
       double    deal_volume       = 0.0 ;
       string    deal_symbol       = "" ;
       long      deal_magic        = 0 ;
       long      deal_reason       =- 1 ;
       if ( HistoryDealSelect (trans.deal))
        {
         deal_entry= HistoryDealGetInteger (trans.deal, DEAL_ENTRY );
         deal_profit= HistoryDealGetDouble (trans.deal, DEAL_PROFIT );
         deal_volume= HistoryDealGetDouble (trans.deal, DEAL_VOLUME );
         deal_symbol= HistoryDealGetString (trans.deal, DEAL_SYMBOL );
         deal_magic= HistoryDealGetInteger (trans.deal, DEAL_MAGIC );
         deal_reason= HistoryDealGetInteger (trans.deal, DEAL_REASON );
        }
       else
         return ;

       if (deal_symbol==m_symbol.Name() && deal_magic==m_magic)
         if (deal_entry== DEAL_ENTRY_OUT )
           {
             if (deal_reason== DEAL_REASON_SL )
               SendNotification ( " Закрыл  позицию > StopLoss" );

             if (deal_reason== DEAL_REASON_TP )
               SendNotification ( "Закрыл  позицию > TakeProfit" );
           }
     }
  }


그래서 새로운 구매 또는 판매

 void OPENORDER( string ord)

  {

  
   double priceL=m_symbol.Ask();
   if (ord== "Sell" )      
     SendNotification ( " открыл позицию > short" );
         //--- check for free money
             if (m_account.FreeMarginCheck( Symbol (), ORDER_TYPE_BUY ,my_lot,priceL)< 0.0 )
               printf ( "We have no money. Free Margin = %f" ,m_account.FreeMargin());
             else
       if (!m_trade.Sell(my_lot, Symbol (),m_symbol.Bid(),my_SL,my_TP, "" ))
         Print ( "BUY_STOP -> false. Result Retcode: " ,m_trade.ResultRetcode(),
               ", description of Retcode: " ,m_trade.ResultRetcodeDescription(),
               ", ticket of order: " ,m_trade.ResultOrder());                     // Если sell, то не открываемся
     double priceS=m_symbol.Bid();
   if (ord== "Buy" )
     SendNotification ( " открыл позицию > long" );
         //--- check for free money
             if (m_account.FreeMarginCheck( Symbol (), ORDER_TYPE_SELL ,my_lot,priceS)< 0.0 )
               printf ( "We have no money. Free Margin = %f" ,m_account.FreeMargin());
             else
       if (!m_trade.Buy(my_lot, Symbol (),m_symbol.Ask(),my_SL,my_TP, "" ))
 
         Print ( "Buy -> false. Result Retcode: " ,m_trade.ResultRetcode(),
               ", description of result: " ,m_trade.ResultRetcodeDescription(),
               ", ticket of deal: " ,m_trade.ResultDeal());
 

인사말. MT5에서 말해주세요.

어드바이저 가 지표 없이 일할 수 있도록 지표에 기반한 어드바이저를 만드는 것이 필요합니다.   .
이 선이 개체가 되지 않도록 차트에 표시된 지표의 데이터를 표시할 수 있습니까?


 
Andrey Sokolov :

인사말. MT5에서 말해주세요.

어드바이저 가 지표 없이 일할 수 있도록 지표에 기반한 어드바이저를 만드는 것이 필요합니다.   .
차트에 새겨진 지표의 데이터를 차트에 표시 하여 이러한 선이 대상이 되지 않도록 할 수 있습니까?


차트 표시기 추가()

Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
ChartIndicatorAdd - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5