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

 
Alexandr Sokolov #:


2)如果一个数组是反向索引的,那么新的单元格应该出现在数组的开头--事实并非如此

为什么新单元格要出现在数组的开头?- 如果我没记错的话,帮助中应该写到,当你使用ArraySetAsSeries()时,数组不会在内存中被重新分配,但在访问数组元素时,会应用反向索引。

SZZ:你的例子很复杂,我把它勾画出来了。

#property strict
//+------------------------------------------------------------------+
void OnStart()
{
   int arr1[] = {1, 2, 3, 4, 5};
   int arr2[] = {1, 2, 3, 4, 5};
   ArraySetAsSeries(arr2, true);
   Print("Start size : ", ArraySize(arr1), " , ", ArraySize(arr2));
   Print("Resize : ", ArrayResize(arr1, 10), " , ", ArrayResize(arr2, 10));
   string s1 = "", s2 = "";
   for(int i = 0, j = 0; i < ArraySize(arr1) && j < ArraySize(arr2); i++, j++)
   {
      s1 += (string)arr1[i] + " , ";
      s2 += (string)arr2[j] + " , ";
   }
   Print("arr1 = ", s1);
   Print("arr2 = ", s2);
}

2022.04.18 21:31:59.223 tst EURUSD,H1: arr2 = 5 , 4 , 3 , 2 , 1 , 0 , 0 , 0 , 0 , 0 。

2022.04.18 21:31:59.223 tst EURUSD,H1: arr1 = 1 , 2 , 3 , 4 , 5 , 0 , 0 , 0 , 0 , 0 。

2022.04.18 21:31:59.223 tst EURUSD,H1: 调整大小 : 10 , 10

2022.04.18 21:31:59.223 tst EURUSD,H1: Start size : 5 , 5

 
请告知在MT5中如何运作
iClose(NULL,PERIOD_CURRENT,shift)

我得到"iClose"错误--对超载函数的模糊调用。

一般来说,目标是选择TF。

出于习惯,我想用MT4选择它。

if(iClose(NULL, TF(), 1) < iOpen(NULL, TF(), 1))

int TF()
  {
   int tf;
   switch(TF)
     {
      case 1 :
         tf = 1;
         break;
      case 2 :
         tf = 5;
         break;
      case 3 :
         tf = 15;
         break;
      case 4 :
         tf = 30;
         break;
      case 5 :
         tf = 60;
         break;
      case 6 :
         tf = 240;
         break;
      case 7 :
         tf = 1440;
         break;
      case 8 :
         tf = 10080;
         break;
      case 9 :
         tf = 43200;
         break;
      default:
         tf = 10;
         Print(tf);
     }
   return(tf);
  }

但我已经失败了。

 
Александр 'iClose'错误--对超载函数的模糊调用。

一般来说,目标是选择TF。

出于习惯,我想用MT4选择它。

但我失败了。

MT5中的时期

if(Period()==1) 返回 "M1"。

if(Period()==2) 返回 "M2"。

if(Period()==3) 返回 "M3"。

如果(Period()==4) 返回 "M4"。

if(Period()==5) 返回 "M5"。

if(Period()==6) 返回 "M6"。

if(Period()==10) 返回 "M10"。

if(Period()==12) 返回 "M12"。

if(Period()==15) 返回 "M15"。

if(Period()==20) 返回 "M20"。

if(Period()==30) 返回 "M30"。

if(Period()==16385) 返回 "H1"。

如果(Period()==16386) 返回 "H2"。

if(Period()==16387) 返回 "H3"。

if(Period()==16388) 返回 "H4"。

if(Period()==16390) 返回 "H6"。

if(Period()==16392) 返回 "H8"。

如果(Period()==16396) 返回 "H12"。

if(Period()==16408) 返回 "每日"。

if(Period()==32769) 返回 "每周"。

if(Period()==49153) 返回 "每月"。

 
Andrei Sokolov #:

在mt5中的时期

if(Period()==1) 返回 "M1"。

如果(Period()==2) 返回 "M2"。

if(Period()==3) 返回 "M3"。

如果(Period()==4) 返回 "M4"。

if(Period()==5) 返回 "M5"。

if(Period()==6) 返回 "M6"。

if(Period()==10) 返回 "M10"。

if(Period()==12) 返回 "M12"。

if(Period()==15) 返回 "M15"。

if(Period()==20) 返回 "M20"。

if(Period()==30) 返回 "M30"。

if(Period()==16385) 返回 "H1"。

如果(Period()==16386) 返回 "H2"。

if(Period()==16387) 返回 "H3"。

if(Period()==16388) 返回 "H4"。

if(Period()==16390) 返回 "H6"。

if(Period()==16392) 返回 "H8"。

如果(Period()==16396) 返回 "H12"。

if(Period()==16408) 返回 "每日"。

if(Period()==32769) 返回 "每周"。

if(Period()==49153) 返回 "每月"。

谢谢你!

 
Александр #:

谢谢你!

你为什么不喜欢ENUM_TIMEFRAMES

而且你可以把变量以枚举的形式放在输入中,并随心所欲地选择它们......为什么要弄得这么乱呢? 而且在mql4中,这种枚举已经有很长时间了......

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

你为什么不喜欢ENUM_TIMEFRAMES

而且你可以把变量作为一个枚举放在输入中,并随心所欲地选择它们......为什么你要这么麻烦呢? 而且在mql4中,这个枚举已经存在很久了......

+

 
Alexey Viktorov #:

你为什么不喜欢ENUM_TIMEFRAMES

而且你可以把变量以枚举的形式放在输入中,并随心所欲地选择它们......为什么要弄得这么乱呢? 而且在mql4中,这种枚举也已经存在很久了......

谢谢你!我不知道。

 

同事们,请告知最佳算法,以找到最接近当前价格的先前下达的限价单的价格--分别为上升卖出限价、出价

最接近底部的买入限额。

这个f-iio计算数量,但我需要之前下的限价单的价格来使f-iio返回。


到目前为止,我使用最小价格作为卖出限制,最大价格作为买入限制....。

int Price_of_orders(int Magic_) // цена ближайшего ордера к цене по магику
  {
//--- получим общее количество ордеров
   int ord = 0; // итоговое значение кол-ва ордеров
   int orders=OrdersTotal();
//--- пробежим по списку ордеров
   for(int i=0;i<orders;i++)
     {
      ResetLastError();
      //--- скопируем в кэш ордер по его номеру в списке
      ulong ticket=OrderGetTicket(i);
      if(ticket!=0)// если ордер успешно скопирован в кэш, работаем с ним
        {
         double price_open  =OrderGetDouble(ORDER_PRICE_OPEN);
         datetime time_setup=OrderGetInteger(ORDER_TIME_SETUP);
         string symbol      =OrderGetString(ORDER_SYMBOL);
         long magic_number  =OrderGetInteger(ORDER_MAGIC);
         if(magic_number==Magic_)
           {
            //  обработаем ордер с заданным ORDER_MAGIC - посчитаем
            ord++;
           }
         PrintFormat("Ордер #%d по %s был выставлен %s, ORDER_MAGIC=%d",ticket,symbol,TimeToString(time_setup),magic_number);
        }
      else         // вызов OrderGetTicket() завершился неудачно
        {
         PrintFormat("Ошибка при получении ордера из списка в кэш. Код ошибки: %d",GetLastError());
        }

     }
   return (ord);   
  }
 
Roman Shiredchenko #:

同事们,请告知最佳算法,以找到最接近当前价格的先前下达的限价单的价格--分别为上升卖出限价、出价

最接近底部的买入限额。

这个f-iio计算数量,但我需要之前下的限价单的价格来使f-iio返回。


到目前为止,我使用最低价格作为卖出限制,最高价格作为买入限制....。

我想在我的结构或数组中保存所需的价格和门票,也许还有其他东西,例如时间,并在添加后立即按价格排序。按资源来说,如果你不经常搜索,那么它的价格是一样的,或者更贵一点,如果经常搜索,最好能记住。当然,如果你没有100500个订单)那么它可能太贵了。一般来说,结构或多维数组中的排序问题只解决了第一个索引的不幸。

有时我使用几个具有相同索引的一维数组,门票、时间、价格。并通过必要的财产索引进行搜索。例如,我们得到一个较小的时间或较大的价格的指数,并得到必要的订单的票。 当然,这是一个拐杖,但它的作用很明显。

 

出现了一个问题,在搜索中没有发现。是否有可能从EA启用自动交易。获取终端的属性,无论它是否被启用。

是否有可能在一个终端上运行一个启用了algotrading的EA,而另一个没有。

原因: