新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 385

 
Alexandr Ivanov:

嗯,我也没有找到...

悲伤。因此,你必须估计1个柱子里有多少个点,并从中得出结论--这些是开盘价 还是所有点。

只要有正确的技能,制作MT4 EA跨平台是5分钟(一次!)。然后你在MT5中用真实 或自定义刻度线进行测试(多次),并在MT4中交易。

 

大家好。有一个脚本,可以通过选择改变所有打开的图表上的TF

需要做一个批准的,改变模式的

但对于这一点,至少要告诉我什么是代码方面的模式

 

你好。有一个现成的SMI指标。但这并不奏效。当我第一次运行它时,它确实如此,但随后我不得不按刷新或切换到另一个时间框架,每一个新的酒吧。为什么?也许这个问题在这里已经被提出来了,我可以直接获得链接吗?预先感谢你。

附加的文件:
SMI.mq4  8 kb
 

请解释为什么该订单没有打开。

下面是日志中的几行字。

2017.11.24 20:00:00.061 '5390918': requote 1.19357 / 1.19368 for open sell 0.01 EURUSD at 1.19361 sl: 1.19848 tp: 1.18402

2017.11.24 19:59:59.515 '5390918': 即时订单在1.19361卖出0.01欧元兑美元 sl: 1.19848 tp: 1.18402

滑点是11个点。在EA中滑点被设定为27点。检查订单开盘的结果是错误138(新价格)。

请解释为什么该订单没有打开?

 
RichLux:

请解释为什么该订单没有打开。

下面是日志中的几行字。

2017.11.24 20:00:00.061 '5390918': requote 1.19357 / 1.19368 for open sell 0.01 EURUSD at 1.19361 sl: 1.19848 tp: 1.18402

2017.11.24 19:59:59.515 '5390918': 即时订单在1.19361卖出0.01欧元兑美元 sl: 1.19848 tp: 1.18402

滑点是11个点。在EA中滑点被设定为27点。检查订单开盘的结果是错误138(新价格)。

请解释为什么该订单没有打开?

改变交易或账户类型以避免这些问题。你应该得到一个有市场执行力的账户--忘掉即时性。

 

请告知如何编写代码来关闭交易,而不是在信号指标的对面,并获取利润,并且顾问不会在关闭后立即打开。

例如,一个信号,进入不同时期的移动平均线 的交叉点,获利50点,如果可能的话,在MQL5

我有一个代码,一旦它达到获利并关闭交易,就立即打开一个新的交易,即使没有新的信号/交叉点。

 
再会。请看代码。出现新横线时机器人不移除横线
//+------------------------------------------------------------------+
//|                                                          2.0.mq4 |
//|                                       Copyright 2017,UriyGlushko |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017,UriyGlushko"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict

extern string Rodot           = "Параметры робота" ;
extern double Lots            = 0.1 ;
extern int     StopLoss        = 20 ;
extern int     TakeProfit      = 80 ;
extern int     Magic           = 568422685 ;
extern int     Slippage        = 3 ; // Проскальзывание
extern int     Shag            = 40 ; // Шаг для трейлингстопа
extern int     Tral_dist       = 40 ; // Дистанция трейлингстопа
extern bool    Use_traling     = true ; // Использование трейлингстопа true - Включено, false - Выключено
extern bool    Use_shag        = false ; // Использование шага. true - Включено, false - Выключено
extern bool    Use_bezubitok   = true ; // Использование безубытка. true - Включено, false - Выключено



//      Параметры индикатора moving_averages
extern string   MA             = "Параметры Скользащей средней" ;
extern int      MA_Period      = 3 ; // Период
extern int      MA_Shift       = 0 ; // Сдвиг
extern int      MA_Method      = 0 ; // 0-простая, 1-экспонециальная, 2-сглаженная, 3-линейно-взвешенная

//      Параметры разворотных свечей
extern string Comment2 = "Параметры разворотных свечей" ;
extern bool _Doji           = false ;
extern ENUM_TIMEFRAMES      TimeFrame       = PERIOD_M5 ; // Период разворотной свечи
extern ENUM_TIMEFRAMES      LittleTimeFrame = PERIOD_M1 ; // Период точки входа
extern int                  ATR_period      = 14 ;         // Период индикатора волотильности

//      Параметры уровней области разворота
extern string Comment3 = "Параметры уровней области разворота" ;
extern int UpLineSell = 4 ;     // Верхняя линия ОР для продаж (пункт от High)
extern int DownLineSell = 4 ;   // Нижняя линия ОР для продаж (пункт от High)
extern int UpLineBuy = 4 ;     // Верхняя линия ОР для покупок (пункт от Low)
extern int DownLineBuy = 4 ;   // Нижняя линия ОР для покупок (пункт от Low)

double sl, tp, dist, shag, ma1, ma2;
int ticket;



int DojiCandle = 0 ;               //Счетчик баров "Дожи"
int DojiCandleBuy = 0 ;             //Счетчик входных баров на разворотном баре "Дожи" Buy
int DojiCandleSell = 0 ;           //Счетчик входных баров на разворотном баре "Дожи" Sell
int lineDojiCandle = 0 ;           //Счетчик уровней области разворота по паттерну "Дожи"


// Переменные функции "Новый бар"
bool New_Bar = false ;



// Переменные функции паттерна "Дожи"
bool BuyDoji = false ;
bool SellDoji = false ;
bool TradeUpDoji = false ;
bool TradeDownDoji = false ;
double UpLine_Doji;
double DownLine_Doji;


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   if ( Digits == 3 || Digits == 5 )
  {
   TakeProfit *= 10 ;
   StopLoss   *= 10 ;
   Slippage   *= 10 ;
   UpLineSell *= 10 ;
   DownLineSell *= 10 ;
   UpLineBuy *= 10 ;
   DownLineBuy *= 10 ;
  }

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

   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   int magic = Magic;
   int shag_ = Shag;
   
   double Open1 = NormalizeDouble ( iOpen ( Symbol (), TimeFrame, 1 ), Digits );
   double Close1 = NormalizeDouble ( iClose ( Symbol (), TimeFrame, 1 ), Digits );
   double High1 = NormalizeDouble ( iHigh ( Symbol (), TimeFrame, 1 ), Digits );
   double Low1 = NormalizeDouble ( iLow ( Symbol (), TimeFrame, 1 ), Digits );
   
   Fun_New_Bar();
   Doji();

     ma1 = iCustom ( NULL , 0 , "moving_averages" ,MA_Period, MA_Shift, MA_Method, 0 , 1 );
     ma2 = iCustom ( NULL , 0 , "moving_averages" ,MA_Period, MA_Shift, MA_Method, 0 , 2 );
     

   if (_Doji == true )
     {
     if (SellDoji == true )
       {
           if (! ObjectCreate ( ChartID (), "Arrow_Down_Doji" + IntegerToString (DojiCandle), OBJ_ARROW_DOWN , 0 , TimeCurrent (), High [ 1 ] + 70 * Point ))
             {
             Print ( "Не удалось создать метку вниз" );
             }
             ObjectSetInteger ( ChartID (), "Arrow_Down_Doji" + IntegerToString (DojiCandle), OBJPROP_COLOR , clrChocolate ); //--- установка цвета
             ObjectSetInteger ( ChartID (), "Arrow_Down_Doji" + IntegerToString (DojiCandle), OBJPROP_STYLE , STYLE_SOLID ); //--- установка стиля линии
             ObjectSetInteger ( ChartID (), "Arrow_Down_Doji" + IntegerToString (DojiCandle), OBJPROP_WIDTH , 1 ); //--- установка толщины линии
             ObjectSetInteger ( ChartID (), "Arrow_Down_Doji" + IntegerToString (DojiCandle), OBJPROP_BACK , false ); //--- отображение на переднем (false) или заднем (true) плане
             DojiCandle ++;
             
           if (! ObjectCreate ( ChartID (), "UpLine_Doji" + IntegerToString (lineDojiCandle), OBJ_HLINE , 0 , TimeCurrent (),UpLine_Doji))
             {
             Print ( "Не удалось создать верхнюю линию" );
             }
             ObjectSetInteger ( ChartID (), "UpLine_Doji" + IntegerToString (lineDojiCandle), OBJPROP_COLOR , clrChocolate ); //--- установим цвет прямоугольника 
             ObjectSetInteger ( ChartID (), "UpLine_Doji" + IntegerToString (lineDojiCandle), OBJPROP_STYLE , STYLE_SOLID ); //--- установим стиль линий прямоугольника 
             ObjectSetInteger ( ChartID (), "UpLine_Doji" + IntegerToString (lineDojiCandle), OBJPROP_WIDTH , 1 ); //--- установим толщину линий прямоугольника 
             ObjectSetInteger ( ChartID (), "UpLine_Doji" + IntegerToString (lineDojiCandle), OBJPROP_BACK , false ); //--- отобразим на переднем (false) или заднем (true) плане 
             
           if (! ObjectCreate ( ChartID (), "DownLine_Doji" + IntegerToString (lineDojiCandle), OBJ_HLINE , 0 , TimeCurrent (),DownLine_Doji))
             {
             Print ( "Не удалось создать нижнюю линию" );
             }
             ObjectSetInteger ( ChartID (), "DownLine_Doji" + IntegerToString (lineDojiCandle), OBJPROP_COLOR , clrBrown ); //--- установим цвет прямоугольника 
             ObjectSetInteger ( ChartID (), "DownLine_Doji" + IntegerToString (lineDojiCandle), OBJPROP_STYLE , STYLE_SOLID ); //--- установим стиль линий прямоугольника 
             ObjectSetInteger ( ChartID (), "DownLine_Doji" + IntegerToString (lineDojiCandle), OBJPROP_WIDTH , 1 ); //--- установим толщину линий прямоугольника 
             ObjectSetInteger ( ChartID (), "DownLine_Doji" + IntegerToString (lineDojiCandle), OBJPROP_BACK , false ); //--- отобразим на переднем (false) или заднем (true) плане 
             lineDojiCandle ++;
           
         if (Open1 == Close1)
           {
             if (! ObjectCreate ( ChartID (), "Arrow_Down_Doji" + IntegerToString (DojiCandle), OBJ_ARROW_DOWN , 0 , TimeCurrent (), High [ 1 ] + 70 * Point ))
               {
               Print ( "Не удалось создать метку вниз" );
               }
               ObjectSetInteger ( ChartID (), "Arrow_Down_Doji" + IntegerToString (DojiCandle), OBJPROP_COLOR , clrChocolate ); //--- установка цвета
               ObjectSetInteger ( ChartID (), "Arrow_Down_Doji" + IntegerToString (DojiCandle), OBJPROP_STYLE , STYLE_SOLID ); //--- установка стиля линии
               ObjectSetInteger ( ChartID (), "Arrow_Down_Doji" + IntegerToString (DojiCandle), OBJPROP_WIDTH , 1 ); //--- установка толщины линии
               ObjectSetInteger ( ChartID (), "Arrow_Down_Doji" + IntegerToString (DojiCandle), OBJPROP_BACK , false ); //--- отображение на переднем (false) или заднем (true) плане
               DojiCandle ++;
               Print ( "Дожи крест Down" );
            
             if (! ObjectCreate ( ChartID (), "UpLine_Doji" + IntegerToString (lineDojiCandle), OBJ_HLINE , 0 , TimeCurrent (),UpLine_Doji))
               {
               Print ( "Не удалось создать верхнюю линию" );
               }
               ObjectSetInteger ( ChartID (), "UpLine_Doji" + IntegerToString (lineDojiCandle), OBJPROP_COLOR , clrOrangeRed ); //--- установим цвет прямоугольника 
               ObjectSetInteger ( ChartID (), "UpLine_Doji" + IntegerToString (lineDojiCandle), OBJPROP_STYLE , STYLE_SOLID ); //--- установим стиль линий прямоугольника 
               ObjectSetInteger ( ChartID (), "UpLine_Doji" + IntegerToString (lineDojiCandle), OBJPROP_WIDTH , 1 ); //--- установим толщину линий прямоугольника 
               ObjectSetInteger ( ChartID (), "UpLine_Doji" + IntegerToString (lineDojiCandle), OBJPROP_BACK , false ); //--- отобразим на переднем (false) или заднем (true) плане 
                  
             if (! ObjectCreate ( ChartID (), "DownLine_Doji" + IntegerToString (lineDojiCandle), OBJ_HLINE , 0 , TimeCurrent (),DownLine_Doji))
               {
               Print ( "Не удалось создать нижнюю линию" );
               }
               ObjectSetInteger ( ChartID (), "DownLine_Doji" + IntegerToString (lineDojiCandle), OBJPROP_COLOR , clrBrown ); //--- установим цвет прямоугольника 
               ObjectSetInteger ( ChartID (), "DownLine_Doji" + IntegerToString (lineDojiCandle), OBJPROP_STYLE , STYLE_SOLID ); //--- установим стиль линий прямоугольника 
               ObjectSetInteger ( ChartID (), "DownLine_Doji" + IntegerToString (lineDojiCandle), OBJPROP_WIDTH , 1 ); //--- установим толщину линий прямоугольника 
               ObjectSetInteger ( ChartID (), "DownLine_Doji" + IntegerToString (lineDojiCandle), OBJPROP_BACK , false ); //--- отобразим на переднем (false) или заднем (true) плане 
               lineDojiCandle ++; 
            }
        }
         
       static int switch12 = 0 ;
       static int switch22 = 0 ;
       static int switch32 = 0 ;
      
       if (ma2 > UpLine_Doji && ma2 > DownLine_Doji && ma1 > UpLine_Doji && ma1 > DownLine_Doji)
        {
        UpLine_Doji = 0 ;
        DownLine_Doji = 0 ;
        }
      
       if (ma2 > DownLine_Doji)
        {
         if (ma1 < DownLine_Doji)
          {
          switch12 = 1 ;
           Print ( "пересечение дожи 1" );
          }
        }
         
       if (ma2 < DownLine_Doji)
        {
         if (ma1 > DownLine_Doji)
          {
           if (switch12 == 1 )
            {
            switch22 = 1 ;
             Print ( "пересечение дожи 2" );
            }
          }
        }
         
       if (ma2 > DownLine_Doji)
         {
         if ( Close [ 1 ] < DownLine_Doji)
           {
           if (switch12 == 1 )
             {
             if (switch22 == 1 )
               {
               switch32 = 1 ;
               Print ( "пересечение дожи 3" );
               }
             }
           }
         }
         
       if (switch12 == 1 )
         {
         if (switch22 == 1 )
           {
           if (switch32 == 1 )
             {
             if (! ObjectCreate ( ChartID (), "Arrow_Sell_Doji" + IntegerToString (DojiCandleSell), OBJ_ARROW_SELL , 0 , TimeCurrent (), Low [ 1 ] + 50 * Point ))
               {
               Print ( "Не удалось создать метку вниз" );
               }
               ObjectSetInteger ( ChartID (), "Arrow_Sell_Doji" + IntegerToString (DojiCandleSell), OBJPROP_COLOR , clrChocolate ); //--- установка цвета
               ObjectSetInteger ( ChartID (), "Arrow_Sell_Doji" + IntegerToString (DojiCandleSell), OBJPROP_STYLE , STYLE_SOLID ); //--- установка стиля линии
               ObjectSetInteger ( ChartID (), "Arrow_Sell_Doji" + IntegerToString (DojiCandleSell), OBJPROP_WIDTH , 1 ); //--- установка толщины линии
               ObjectSetInteger ( ChartID (), "Arrow_Sell_Doji" + IntegerToString (DojiCandleSell), OBJPROP_BACK , false ); //--- отображение на переднем (false) или заднем (true) плане
               DojiCandleSell ++;
               Print ( "Точка входа SELL по разворотной свече 'Дожи'" );
               UpLine_Doji = 0 ;
               DownLine_Doji = 0 ;
               
             if ( ObjectFind ( ChartID (), "Arrow_Sell_Doji" + IntegerToString (DojiCandleSell)))
               {
               switch12 = 0 ;
               switch22 = 0 ;
               switch32 = 0 ;
               }
                         
             if ( ObjectFind ( ChartID (), "UpLine_Doji" + IntegerToString (lineDojiCandle)) && ObjectFind ( ChartID (), "DownLine_Doji" + IntegerToString (lineDojiCandle)))
               {
               ObjectDelete ( "UpLine_Doji" + IntegerToString (lineDojiCandle));
               ObjectDelete ( "DownLine_Doji" + IntegerToString (lineDojiCandle));
               Print ( "Линии удалены" );
               }
               Print ( "Не удалось удалить верхнюю и нижнюю линии" ); 
             }
           }
         }
     
     }
   

      
   
 }
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
//+------------------------------------------------------------------+
//    Функция определения нового бара                                |
//+------------------------------------------------------------------+
void Fun_New_Bar()
{ 
   datetime TimeBar0 = iTime ( Symbol (),TimeFrame, 0 );
   static datetime New_Time= 0 ;                     // Время текущего бара
   New_Bar= false ;                                 // Нового бара нет 
   if (New_Time != TimeBar0)                       // Сравниваем время 
   { 
      New_Time = TimeBar0;                         // Теперь время такое 
      New_Bar = true ;                             // Поймался новый бар 
   } 
}

//+------------------------------------------------------------------+
//    Функция паттерна Дожи для бычьего и медвежьего рынка          |
//+------------------------------------------------------------------+
void Doji()
{
//Параметры Дожи
   double Open1 = NormalizeDouble ( iOpen ( Symbol (), TimeFrame, 1 ), Digits );
   double Close1 = NormalizeDouble ( iClose ( Symbol (), TimeFrame, 1 ), Digits );
   double High1 = NormalizeDouble ( iHigh ( Symbol (), TimeFrame, 1 ), Digits );
   double Low1 = NormalizeDouble ( iLow ( Symbol (), TimeFrame, 1 ), Digits );
   double Open2 = NormalizeDouble ( iOpen ( Symbol (), TimeFrame, 2 ), Digits );
   double Close2 = NormalizeDouble ( iClose ( Symbol (), TimeFrame, 2 ), Digits );
   double High2 = NormalizeDouble ( iHigh ( Symbol (), TimeFrame, 2 ), Digits );
   double Low2 = NormalizeDouble ( iLow ( Symbol (), TimeFrame, 2 ), Digits );
   
//Параметры индикатора волотильности ATR для нахожденя относительно большой свечи перед Доджи
   double ATR = iATR ( Symbol (),TimeFrame,ATR_period, 1 );
   
   BuyDoji = false ;
   SellDoji = false ;
   
//Математическое описание патерна Дожи
   if (Close1 < High1 - NormalizeDouble ( 0.3 *(High1-Low1), Digits )&& 
      Open1 < High1 - NormalizeDouble ( 0.3 *(High1-Low1), Digits )&& 
      Close1 > High1 - NormalizeDouble ( 0.7 *(High1-Low1), Digits )&& 
      Open1 > High1 - NormalizeDouble ( 0.7 *(High1-Low1), Digits )&& 
       MathAbs (Close1-Open1) <= NormalizeDouble ( 0.4 *(High1-Low1), Digits )&&
       MathAbs (Close2-Open2) > 0.8 *ATR && MathAbs (High1-Low1) > 0.6 *ATR)
      {
         if ((Close2 - Open2) > 0 && New_Bar)
         { 
            UpLine_Doji = High1 + UpLineSell* Point ();
            DownLine_Doji = High1 - DownLineSell* Point ();
            SellDoji = true ;
             Print ( "Down Doji" ); // Условие разворота в медвежий тренд
         }
         if ((Close2 - Open2) < 0 )
         {
            UpLine_Doji = High1 + UpLineBuy* Point ();
            DownLine_Doji = High1 - DownLineBuy* Point ();
            BuyDoji = true ;
             Print ( "Up Doji" ); // Условие разворота в бычий тренд
         }
      }
      
}

使用变量

       static int switch12 = 0 ;
       static int switch22 = 0 ;
       static int switch32 = 0 ;

入口点条件被写入

 
voron_026:
下午好。请看一下代码。当出现新的水平线 时,机器人不会删除水平线

使用变量

来写入口点的条件

原因是在行名中加入了一个计数器,在删除之前,该值会增加一个。

 
我明白你的意思。那么如何实施拆线。我需要在一个新的图案出现时,立即删除这些线条,并有自己的线条。
 
voron_026:
我明白你的意思。那么如何实施拆线。我需要在出现一个有自己线条的新图案时,立即删除这些线条。

你有什么自己的建议吗?

也许先删除然后再创建?或者不删除,只改变坐标?删除和创建新的有什么意义呢?

原因: