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

 
Alexey Viktorov:

确实不是所有的键盘都有我写的东西......也许你应该改变你的键盘。



这里有太多的 "专家 "了 :)所以我想我要取笑你。他们不回答问题,而是开始说教。

 
Luchezar Shalomaev:

这里有太多的 "专家 "了 :)所以我决定取笑他们。不回答问题,而是开始讲课。

那么就不要指望那些忙于做自己的事情而分心帮助你的人提供正常的答案,如果你把自己放在一个取笑施主的位置上。

这不是一个马戏团。

 
Artyom Trishkin:

那么今后就不要指望从那些忙于业务、心不在焉地帮助你的人那里得到正常的回应,如果你把自己放在一个取笑施舍者的位置。

这不是一个马戏团。



亲爱的主持人,如果这不是一个马戏团,你能不能把回答我问题的小丑们带到后台?谢谢你。

 
Luchezar Shalomaev:


亲爱的主持人,如果这不是一个马戏团,你能不能好心地把回答我问题的小丑们带到后台?谢谢你。

这就是送你到幕后的方式吗?

你。

关于交易、自动交易系统和策略测试的论坛

初学者对MQL4的任何问题,对算法和代码的帮助和讨论

Luchezar Shalomaev, 2017.09.20 22:25

你好。从Ducascopy下载了欧元兑美元的1分钟报价文件,试图导入MT4 Alpari,但没有任何反应。只是一个空白的转换窗口。在Instaforex也一样。会是什么呢?

答案是。

关于交易、自动交易系统和策略测试的论坛

初学者对MQL4的任何问题,对算法和代码的帮助和讨论

Vitaly Muzichenko, 2017.09.20 22:32

你要在dukascopy交易吗?不是吗?那么你为什么需要他们的报价呢?

你。

答案是。

你。

响应。

你。

你。

关于交易、自动交易系统和交易策略测试的论坛

初学者对MQL4的任何问题,对算法和代码的帮助和讨论

Alexey Viktorov, 2017.09.21 09:34

真的不是所有的键盘都有我写的这些东西...也许应该换一下键盘?


你。

关于交易、自动交易系统和交易策略测试的论坛

新手对MQL4的任何问题,对算法和代码的帮助和讨论

Luchezar Shalomaev, 2017.09.21 21:10


这里有太多的 "专家 "了 :)所以决定取笑他们。他们不回答你的问题,而是开始说教。


你的问题 已经得到了回答--按F2,会出现报价下载窗口。

但你开始戏谑,得到了戏谑的回答。

你想要什么?俗话说:"来之能战,战之能胜"......。

 
Artyom Trishkin:

那么我应该让你到后台去吗?

你。

答案是。

你。

响应。

你。

响应。

你。

你。

你。


的问题 已经得到了回答--按F2,会出现报价下载窗口。

但你开始戏谑,你得到了一个戏谑的回应。

你想要什么?俗话说:"来之能战,战之能胜"......。













嗯,你说这不是一个马戏团。

 
Aleksey Vyazmikin:
最简单的方法是把逻辑写得更清楚--我不明白这个逻辑是什么?你能用语言描述一下吗?

在逻辑上发现了一个错误。修正了它,它可以工作。

int Doji()
{

//Параметры Дожи
   double Open1 = NormalizeDouble (iOpen(Symbol(), PERIOD_H4,1),Digits);
   double Close1 = NormalizeDouble (iClose(Symbol(), PERIOD_H4,1),Digits);
   double High1 = NormalizeDouble (iHigh(Symbol(), PERIOD_H4,1),Digits);
   double Low1 = NormalizeDouble (iLow(Symbol(), PERIOD_H4,1),Digits);
   
//Параметры предыдущей свечи
   double Open2 = NormalizeDouble (iOpen(Symbol(), PERIOD_H4,2),Digits);
   double Close2 = NormalizeDouble (iClose(Symbol(), PERIOD_H4,2),Digits);
   double High2 = NormalizeDouble (iHigh(Symbol(), PERIOD_H4,2),Digits);
   double Low2 = NormalizeDouble (iLow(Symbol(), PERIOD_H4,2),Digits);
   
//Параметры индикатора волотильности ATR для нахожденя относительно большой свечи перед Доджи
   double ATR = iATR(Symbol(),PERIOD_H4,21,1);
   
   
//Математическое описание патерна Дожи
   if(Close1 < High1 -0.3*(High1-Low1) && 
      Open1 < High1 -0.3*(High1-Low1) && 
      Close1 > High1 -0.7*(High1-Low1) && 
      Open1 > High1 -0.7*(High1-Low1) && 
      MathAbs(Close1-Open1) < 0.2*(High1-Low1)&&
      MathAbs(Close2-Open2) > 0.7*ATR)
      {
         if((Close2 - Open2) > 0 && New_Bar == true)
         { 
            Print ("Down"); return(-1);// Условие для продаж
         }
         if((Close2 - Open2) < 0 && New_Bar == true)
         {
            Print ("Up"); return(1);// Условие для покупок
         }
      }
      return(0);
}
错误在于对十字星形态的数学描述。
 

现在的任务是这样的。我们需要画一个矩形,而不是一个箭头,它将由最大和最小的十字星以及十字星的开盘时间 和十字星之后的新条形的开盘时间来绘制。而这都是在4小时的图表上。同时,我需要在5分钟的图表上。你能提供什么建议?如何实施?

我不知道该怎么做,谢谢你。

 
voron_026:

在逻辑上发现了一个错误。修理好了,正在工作。

错误在于对十字星形态的数学描述。

对你有好处。你以前编过程序吗?你的风格并不典型。

voron_026:

现在的任务是这样的。我们必须画一个矩形,而不是箭头,它将由最大和最小的十字星以及十字星的开盘时间 和十字星之后的新条形的开盘时间来画。而这一切都发生在4小时图上。同时,我需要在5分钟的图表上。你能提供什么建议?如何实施?

谢谢你。


对普通(全局)变量进行声明,这些变量将在函数中计算,并从函数中返回 void(){} 。你能不能定义一下时间...总之,我还没有理解这个确切的问题。

顺便说一下,我以前不知道全局变量的方法,而是通过字符串变量从函数中返回所有的值。

 
voron_026:

现在的任务是这样的。我们需要画一个矩形,而不是一个箭头,它将由最大和最小的十字星以及十字星的开盘时间 和十字星后的新条形的开盘时间来绘制。而这都是在4小时的图表上。同时,我需要在5分钟的图表上。你能提供什么建议?如何实施?

谢谢你。

你必须使用OBJ_RECTANGLE。 你知道如何从H4图表中获得价格和时间数据。

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_RECTANGLE
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_RECTANGLE
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_RECTANGLE - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Aleksey Vyazmikin:

对你有好处。你以前编过程序吗?你的风格并不典型。


做一般(全局)变量的声明,这些变量将在函数中计算并从函数中返回 void(){} .你能不能判断出时间...总之,我不明白这个问题到底是什么。

顺便说一下,我以前不知道全局变量的方法,通过字符串变量返回所有函数的值。


你好,Aleksey Vyazmikin 我不久前才开始编程。我正在慢慢进入这个主题。

我曾这样试过。

//+------------------------------------------------------------------+
//|                                                          111.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.2;
extern int    StopLoss        = 20;
extern int    TakeProfit      = 80;
extern int    Magic           = 999999;
extern int    Slippage        = 3; // Проскальзывание

extern bool UseDojiCandles = true; // Использование патерна Доджи
int DojiCandle = 0;
bool New_Bar = false;

datetime time0 = iTime(Symbol(),PERIOD_H4,0);
datetime time1 = iTime(Symbol(),PERIOD_H4,1);
double open0 = iOpen(Symbol(), PERIOD_H4,0);
double open1 = iOpen(Symbol(), PERIOD_H4,1);
double close1 = iClose(Symbol(), PERIOD_H4,1);
double high1 = iHigh(Symbol(), PERIOD_H4,1);
double low1 = iLow(Symbol(), PERIOD_H4,1);
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  if (Digits == 3 || Digits ==5 )
  {
   TakeProfit *= 10;
   StopLoss   *= 10;
   Slippage   *= 10;
  }
 return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  
   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
Fun_New_Bar();

   if(UseDojiCandles = true && Doji() == 1 && New_Bar == true)
     {
      if(!ObjectCreate(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJ_RECTANGLE,0,time1,open1,time0,open0))
         {
         Print("Не удалось создать метку вверх");
         }
         ObjectSetInteger(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJPROP_COLOR,clrRed);//--- установим цвет прямоугольника 
         ObjectSetInteger(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника 
         ObjectSetInteger(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника 
         ObjectSetInteger(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане 
         
         DojiCandle ++;
     }
   

   
   if(UseDojiCandles = true && Doji() == -1 && New_Bar == true)
     {
      if(!ObjectCreate(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJ_RECTANGLE,0,time1,open1,time0,open0))
         {
         Print("Не удалось создать метку вниз");
         }
         ObjectSetInteger(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJPROP_COLOR,clrRed);//--- установим цвет прямоугольника 
         ObjectSetInteger(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника 
         ObjectSetInteger(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника 
         ObjectSetInteger(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане 

         DojiCandle ++;
     }
     

   
}
//+------------------------------------------------------------------+
//    Поиск всех объектов
//+------------------------------------------------------------------+


 




//+------------------------------------------------------------------+
//    Функция паттерна Доджи
//+------------------------------------------------------------------+
int Doji()
{

//Параметры Дожи
   double Open1 = NormalizeDouble (iOpen(Symbol(), PERIOD_H4,1),Digits);
   double Close1 = NormalizeDouble (iClose(Symbol(), PERIOD_H4,1),Digits);
   double High1 = NormalizeDouble (iHigh(Symbol(), PERIOD_H4,1),Digits);
   double Low1 = NormalizeDouble (iLow(Symbol(), PERIOD_H4,1),Digits);
   
//Параметры предыдущей свечи
   double Open2 = NormalizeDouble (iOpen(Symbol(), PERIOD_H4,2),Digits);
   double Close2 = NormalizeDouble (iClose(Symbol(), PERIOD_H4,2),Digits);
   double High2 = NormalizeDouble (iHigh(Symbol(), PERIOD_H4,2),Digits);
   double Low2 = NormalizeDouble (iLow(Symbol(), PERIOD_H4,2),Digits);
   
//Параметры индикатора волотильности ATR для нахожденя относительно большой свечи перед Доджи
   double ATR = iATR(Symbol(),PERIOD_H4,21,1);
   
   
//Математическое описание патерна Дожи
   if(Close1 < High1 -0.3*(High1-Low1) && 
      Open1 < High1 -0.3*(High1-Low1) && 
      Close1 > High1 -0.7*(High1-Low1) && 
      Open1 > High1 -0.7*(High1-Low1) && 
      MathAbs(Close1-Open1) < 0.2*(High1-Low1)&&
      MathAbs(Close2-Open2) > 0.7*ATR)
      {
         if((Close2 - Open2) > 0 && New_Bar == true)
         { 
            Print ("Down"); return(-1);// Условие для продаж
         }
         if((Close2 - Open2) < 0 && New_Bar == true)
         {
            Print ("Up"); return(1);// Условие для покупок
         }
      }
      return(0);
}
//+------------------------------------------------------------------+
//    Функция определения нового бара
//+------------------------------------------------------------------+
void Fun_New_Bar()                              // Ф-ия обнаружения нового бара 
  {                                             
  datetime TimeBar0 = iTime(Symbol(),PERIOD_H4,0);
   static datetime New_Time=0;                  // Время текущего бара 
   New_Bar=false;                               // Нового бара нет 
   if(New_Time != TimeBar0)                        // Сравниваем время 
     { 
      New_Time = TimeBar0;                         // Теперь время такое 
      New_Bar = true;                             // Поймался новый бар 
     } 
  }  

第一个矩形被画出,其余的没有被画出。我仍在试图弄清楚如何去做。谢谢你的提示,你说的非典型风格是什么意思?

原因: