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

 
Artyom Trishkin:
我最近在这里发布了一个跨平台的指标模板。看看吧。
指示器缓冲区()

你需要在博客上发布相同问题的答案....我希望我有这样的耐心!

这里是https://www.mql5.com/ru/forum/160683/page670#comment_9054670

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
  • 2018.10.18
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
Igor Makanu:

你应该在博客上发表对同样问题的回答....我希望我有这样的耐心!

也许你应该这样做。我没有时间。而问题将永远是相同的+/-

 
这个问题通过将辅助变量分配给最后的缓冲区顺序号来解决,但没有规定显示设置。在此之前,不必要的缓冲区在列表的中间位置。
 

帮助。

我想对当天已经平仓的头寸下挂单

该函数将订单放在最后一个平仓的价格上。

我应该怎样做才能把挂单放在当天关闭的所有头寸的价格上?

oid PriceTimePos(string sy="",int op=-1,int mn=-1) 
  {
   datetime t;
   bool daa;
   int d,k_=OrdersTotal(),typ_;
   double   r=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
        {
         if(OrderSymbol()==Symbol()) 
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
              {
               if(op<0 ||OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     if(OrderCloseTime()>=TimeCurrent()-1440*60)
                       {
                        t=OrderCloseTime();
                        r=OrderOpenPrice();
                        sl=OrderStopLoss();
                        tp=OrderTakeProfit();
                        lot=OrderLots();
                        typ_=OrderType();
                        //Print("OpenPrice",r);
                       }
                    }
                 }
              }
           }
        }
     }
// ЕСТЬ ОРДЕР ПО ЦЕНЕ ЗАКРЫТОЙ ПОЗИЦИИ?
   daa=false;
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) 
           {
            if(OrderType()>1 && OrderType()<6) 
              {
               d=MarketInfo(OrderSymbol(), MODE_DIGITS);
               r=NormalizeDouble(r, d);
               if(r==NormalizeDouble(OrderOpenPrice(),d)) {daa=true;}
              }
           }
        }
     }
   if(daa==false)//ЕСЛИ НЕТ ОРДЕРА ПО ЦЕНЕ, СТАВЛЮ
     {
      double opprord=0;
      for(i=0; i<k_; i++) 
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
           {
            if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) 
              {
               if(OrderType()>1 && OrderType()<6) 
                 {
                  d=MarketInfo(OrderSymbol(),MODE_DIGITS);
                  opprord=OrderOpenPrice();
                  // r=NormalizeDouble(r, d);
                  if(r!=NormalizeDouble(opprord,d))
                    {
                     if(r>Ask)
                       {
                        if(typ_==OP_BUY)
                          {
                           Print("OP_BUYSTOP",r);
                           SetOrder(Symbol(),OP_BUYSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                          }
                        if(typ_==OP_SELL)
                          {
                           Print("OP_SELLLIMIT",r);
                           SetOrder(Symbol(),OP_SELLLIMIT,lot,r,sl,tp,_MagicNumber,0,"sl");
                          }
                       }

                     //
                     if(Bid>r)
                       {
                        if(typ_==OP_BUY)
                          {
                           Print("OP_BUYLIMIT",r);
                           SetOrder(Symbol(),OP_BUYLIMIT,lot,r,sl,tp,_MagicNumber,0,"bl");
                          }
                        if(typ_==OP_SELL)
                          {
                           Print("OP_SELLSTOP",r);
                           SetOrder(Symbol(),OP_SELLSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                          }
                       }
                    }
                 }
              }
           }
        }
     }
//return(r);
  }
 
PolarSeaman:

帮助。

我想对当天已经平仓的头寸下挂单

该函数将订单放在最后一个平仓的价格上。

我应该怎样做才能将挂单放在一天内关闭的所有头寸的价格上?

  1. 浏览循环中的已关闭头寸列表,选择那些关闭时间超过所需日期开始时间的头寸(如果是前天,则小于第二天开始的时间)。
  2. 将所有找到的头寸的所有收盘价(开盘价--不知道你到底想把它们设置成什么)添加到一个简单的数组或一个结构数组中。
  3. 在循环中浏览创建的数组,并在数组价格上下达挂单(通过检查该价格是否存在订单--你不需要在同一价格上下达多个订单)。
  4. 你也可以在此期间从数组中删除已下订单的价格,但这有点麻烦......
 

我开始通过S.Kovalev的书学习MQL4。Kovalev,代码中存在一些不一致的地方,因为这本书是为MT4的旧版本写的。


请告知如何处理这个代码以避免错误。

#property strict

int Count=0;
int init()      
{
   Alert ("Сработала ф-ия init() при запуске");   // Сообщение
   return;                                                                     // Выход из init()
   }   
//--------------------------------------------------------------------
int start()                                                                           // Спец. ф-ия start()
   {
   double Price = Bid;                                                      // Локальная перемен.
   Count++;                                                                      // Счётчик тиков
   Alert("Новый тик ",Count," Цена = ",Price);       // Сообщение
   return;                                                                        // Выход из start()
   }
int deinit()                                                                              // Спец. ф-ия deinit()
   {
   Alert ("Сработала ф-ия deinit() при выгрузке");         // Сообщение
   return;                                                                                 // Выход из deinit()
   }

错误

'return' -函数 必须返回一个值

1.这样做是否正确?

#property strict

int Count=0;
int init()      
{
   Alert ("Сработала ф-ия init() при запуске");   // Сообщение
   return(0);                                                                     // Выход из init()
   }   
//--------------------------------------------------------------------
int start()                                                                           // Спец. ф-ия start()
   {
   double Price = Bid;                                                      // Локальная перемен.
   Count++;                                                                      // Счётчик тиков
   Alert("Новый тик ",Count," Цена = ",Price);       // Сообщение
   return(0);                                                                        // Выход из start()
   }
int deinit()                                                                              // Спец. ф-ия deinit()
   {
   Alert ("Сработала ф-ия deinit() при выгрузке");         // Сообщение
   return(0);                                                                                 // Выход из deinit()
   }


2.问题,使用教程中给出的知识(我指的是信息的年龄因素)为新的构建写代码有多大问题?



附加的文件:
 
Sergey Branin:

我开始通过S.Kovalev的书学习MQL4。Kovalev,代码中存在一些不一致的地方,因为这本书是为MT4的旧版本写的。


请告知如何处理这个代码以避免错误。

错误

'return' -函数 必须返回一个值

1.这样做是否正确?


2.问题,使用教程中给出的知识为新的构建编写代码有多大问题(我指的是信息老化因素)?



使用OnInit()、OnDeinit()、OnTick(),以及列表中的其他。

Документация по MQL5: Обработка событий
Документация по MQL5: Обработка событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Sergey Branin:

我开始通过S.Kovalev的书学习MQL4。Kovalev,代码中存在一些不一致的地方,因为这本书是为MT4的旧版本写的。


请告知如何处理这个代码以避免错误。

错误

'return' -函数 必须返回一个值

1.这样做是否正确?


2.问题是,用教程中的知识(我指的是信息的年龄因素)为新的构建编写代码有多大问题?



  1. 你从非无效函数中返回数值是对的,但最好转到新的构建中去--那里没有什么复杂的东西。
  2. 写,不要忘记在代码开头插入#属性严格指令--所有指令都写在这里,阅读错误代码--它们的描述在文档中,一切都会很好,并不复杂。
 
Artyom Trishkin:
  1. 循环浏览已关闭头寸的列表,选择那些关闭时间大于你想要的起始时间的头寸。

谢谢你,我在第一个周期的规定时间内找到了平仓 的开仓价格。它们都出现在打印机上,我需要对它们下订单。

这个数组对我来说有点像拼图,请告诉我如何插入要检查的周期并将它们设置为开盘价,进入搜索这些价格的第一个周期。

那么,把我需要的最古老的一个价格,我如何去找到下一个价格呢?
void PriceTimePos(string sy="",int op=-1,int mn=-1)
  {
   datetime t;
   bool daa;
   int d,k_=OrdersTotal(),typ_;
   double   r=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(OrderCloseTime()>=TimeCurrent()-1440*60)
                       {
                        t=OrderCloseTime();
                        r=OrderOpenPrice();
                        sl=OrderStopLoss();
                        tp=OrderTakeProfit();
                        lot=OrderLots();
                        typ_=OrderType();
                        //Print("OpenPrice",r);

                        // ЕСТЬ ОРДЕР ПО ЦЕНЕ ЗАКРЫТОЙ ПОЗИЦИИ?
                        daa=false;
                        for(i=0; i<k; i++)
                          {
                           if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                             {
                              if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op))
                                {
                                 if(OrderType()>1 && OrderType()<6)
                                   {
                                    d=MarketInfo(OrderSymbol(), MODE_DIGITS);
                                    r=NormalizeDouble(r, d);
                                    if(r==NormalizeDouble(OrderOpenPrice(),d)) daa=true; //else continue;
                                   }
                                }
                             }
                          }
                        if(daa==false)//ЕСЛИ НЕТ ОРДЕРА ПО ЦЕНЕ, СТАВЛЮ
                          {

                           if(r>Ask)
                             {
                              if(typ_==OP_BUY)
                                {
                                 Print("OP_BUYSTOP",r);
                                 SetOrder(Symbol(),OP_BUYSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                                }
                              if(typ_==OP_SELL)
                                {
                                 Print("OP_SELLLIMIT",r);
                                 SetOrder(Symbol(),OP_SELLLIMIT,lot,r,sl,tp,_MagicNumber,0,"sl");
                                }
                             }

                           //
                           if(Bid>r)
                             {
                              if(typ_==OP_BUY)
                                {
                                 Print("OP_BUYLIMIT",r);
                                 SetOrder(Symbol(),OP_BUYLIMIT,lot,r,sl,tp,_MagicNumber,0,"bl");
                                }
                              if(typ_==OP_SELL)
                                {
                                 Print("OP_SELLSTOP",r);
                                 SetOrder(Symbol(),OP_SELLSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                                }
                             }

                          }
                        //return(r);
                       }
                    }
                 }
              }
           }
        }
     }
//
  }
 
PolarSeaman:

谢谢你,我在第一个周期的正确时间找到了平仓 的开盘价。它们都在打印机上显示出来,我需要对它们下订单。

数组对我来说是个迷宫,告诉我如何把要检查的周期和设置为开盘价的周期放到第一个循环中去寻找这些价格。

了解和理解什么是数组,比纠正你所做的事情要快。

特别是由于数组并不简单,但非常简单。

AK弹夹可容纳30个弹夹--这是一个大小为30的阵列。而墨盒是存储在阵列中的数据。

诚然,这不是一个好例子--除非你得到0、1和2,否则你无法得到第三个。

那么想象一下电子表格。

指数0
索引1
指数2
指数3
指数4
索引5。索引6。指数7
索引8
指数9
价值1
指数值2
价值3
价值4
价值5
价值6
价值7
价值8
价值9
价值10

这里有一个简单的大小为10的一维数组。

值1存储在索引为0的单元格中,值2存储在索引为1的单元格中,值3存储在索引为2的单元格中,...。
...
值8存储在索引单元7中,值9存储在索引单元8中,值10存储在索引单元9中

就这么简单。为了获得值3,你需要访问数组--其单元格2:Value3=Array[2]。

原因: