初学者的问题 MQL5 MT5 MetaTrader 5 - 页 829

 
在mt5中,当你在真实的ticks上测试时,佣金是否算在那里,还是只算点差?
 

循环中的多币种专家 按符号询问数据。有这样一个片段。

      int gtc1 = GetTickCount();
      res_copy_buf = CopyBuffer(handle, 0, 0, bars_calc, Buf_01); 
      int gtc2 = GetTickCount();

所有符号都正常通过。在第一遍的时候,时间大约是120ms,因为指示器缓冲区正在填充。从第二遍开始,当前条形图上的计算时间小于1ms。

特殊的是,一个著名的经纪人有EURRUR符号,但没有数据("等待更新")。因此,计算被卡在这一行51秒。错误4806。即使是一次(第一次),51秒也是不可接受的,更不用说一个周期了。

问题。我怎样才能快速地发现某个人物没有数据的事实?然 后我就会记住它,在随后的迭代中,只需跨过它,就能继续前进,不会失去节奏。

 

同事们,请告知如何将一个双数类型 的数组转换为字符串。我需要把它写到一个文件里。这里有一个一般的训练守则。

void OnStart()
{

double ar[];               // Массив
ArrayResize(ar,2);         // Подготовка массива
int i, Size=ArraySize(ar); // стартовое количество элементов

ar[0]=1;                   // Установка значений 2-х элементов массива
ar[1]=2; 

ArrayResize(ar,3); // Увеличение размера массива
ar[2]=3;           // Установка значения новому элементу массива
ArrayResize(ar,4); // Увеличение размера массива
ar[3]=4;           // Установка значения новому элементу массива
ArrayResize(ar,5); // Увеличение размера массива
ar[4]=5;           // Установка значения новому элементу массива
ArrayResize(ar,6); // Увеличение размера массива
ar[5]=6;           // Установка значения новому элементу массив
ArrayResize(ar,7); // Увеличение размера массива
ar[6]=7;           // Установка значения новому элементу массив
Size=ArraySize(ar);// новое количество элементов
ArraySetAsSeries(ar,true); // Смена направления индексации


//--- запись в файл


SaveArrayToFile ("s_ar", ar);
return;
}


bool SaveArrayToFile(string FileName, string  &Array[])
  {
//--- Открытие файла
   int h=FileOpen(FileName,FILE_WRITE|FILE_ANSI|FILE_TXT);
   if(h==-1){Alert(" ошибка открытия файла в ф-ии "); return(false);} // Ошибка открытия файла
   
//--- Запись в файл
   FileWriteInteger(h,ArraySize(Array),INT_VALUE); // Запись размера массива
   FileWriteArray(h,Array); // Запись массива
//--- Закрытие файла
   FileClose(h);
   return(true); // Сохранение выполнено
 

信息取自文章

从文件中保存和加载数组

当从文件中保存和加载一个数组时,我们应该考虑数组大小的第一维和其元素总数的差异。当你保存一个数组时,你应该先把数组的大小(由ArraySize()决定的元素总数)写进文件,然后再写整个数组。

bool SaveArrayToFile(string FileName,string &Array[])
  {
//--- Открытие файла
   int h=FileOpen(FileName,FILE_TXT|FILE_WRITE);
   if(h==-1) return(false); // Ошибка открытия файла
//--- Запись в файл
   FileWriteInteger(h,ArraySize(Array),INT_VALUE); // Запись размера массива
   FileWriteArray(h,Array); // Запись массива
//--- Закрытие файла
   FileClose(h);
   return(true); // Сохранение выполнено
  }
 

你好,我正面临以下问题。

我有两个针对同一工具的EA,分别有不同的Magiks。我通过CTrade设置我的Magik,也通过CTrade开了一个头寸。当我 第一个EA的开仓时,它的magik被分配给第二个EA(我在开仓后检查了它,见下文),所以检查开仓时没有看到我的magik,我在一个方向上开了很多仓。该账户是模拟账户,这在测试器中无法检测到。如果魔力的值被保存在类中,也许它应该被清零,但我不知道怎么做。

int OnInit()
  {    
  // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
   return(INIT_SUCCEEDED);
}
открываю позицию соответственно тоже через CTrade:
 if(SellCount()>0 || BuyCount()>0)
           {
            Print("Уже есть позиция на продажу !!!");
            return; // не добавлять к открытой позиции на покупку
           }
         SL=NormalizeDouble(latest_price.bid + STP*_Point,_Digits);
         TP=NormalizeDouble(latest_price.bid - TKP*_Point,_Digits);
         
         m_trade.Sell(lots1,_Symbol,0,SL,TP,"LaquerreOSC_MA_2.5.6.7 + 2");
         m_position.Select(_Symbol);
           {
            ulong myMagic=m_position.Magic();
            Print(" Открыта поза Селл с магиком № ",myMagic,", И спредом ",SymbolInfoInteger(_Symbol,SYMBOL_SPREAD));
           }
//+------------------------------------------------------------------+
int SellCount()//проверка рыночных ордеров на продажу
  {
   int count=0;
   for(int i=PositionsTotal()-1; i>=0;i--)
     {
      if(PositionSelect(_Symbol)==true)
        {
         if(PositionGetInteger(POSITION_MAGIC)==Magic && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
            count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+

 
Pavel Nikiforov:

你好,我正面临以下问题。

我有两个针对同一工具的EA,分别有不同的Magiks。我通过CTrade设置我的Magik,也通过CTrade开了一个头寸。当我 第一个EA的开仓时,它的magik被分配给第二个EA(我在开仓后检查过,见下文),所以检查开仓时没有看到我的magik,我在一个方向上开了很多仓。该账户是模拟账户,这在测试器中无法检测到。如果魔力的值保存在类中,也许它需要被清零,但我不知道如何。

正确粘贴代码,不要把它作为一张文本


至于代码:为每个EA设置输入参数,有自己的魔力。比方说,你把第一个设置为10001,然后把第二个设置为10002。

 
Vladimir Karputov:

正确地插入代码,而不是作为一张文本


至于代码:用自己的法宝为每个EA设置输入参数。假设你把第一个设置为10001,然后把第二个设置为10002。

谢谢你这么简短的回答。但这就是问题所在,魔法是不同的。因此,我已经确定,第二个机器人与第一个魔术师开仓。我不知道它是如何发生的,也不知道他在哪里保存了第一个EA的神奇数字,但我想弄清楚。

 
Pavel Nikiforov:

谢谢你的快速回复。但这就是问题所在,魔术师是不同的。于是我发现,第二个机器人是用第一个机器人的神奇数字开仓的。我不知道它是如何发生的,也不知道他在哪里保存了第一个魔术师的号码,但我想弄清楚。

在这种情况下,最好是将Magik

  // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
在每次开仓前,而不是在OnInit中。
 
Alexey Viktorov:

在这种情况下,最好指定一个magik

在每次打开位置 之前,而 不是在OnInit中。

在这种情况下,它不是 "更好",它正是你所需要的--它是一个标准交易函数的封装类。它不储存多个魔力。这就是为什么每次在你想用新的魔力开仓之前和之后都应该设置一个魔力。

一般来说,顺序如下。

  • 仓位应以magic 1开仓--我们设置magic 1,随后的仓位将有magic 1。
  • 有必要用 "魔术师2 "开仓--我们设置了 "魔术师2",所有后续仓位都会有 "魔术师2"。
  • 有必要用魔力3开仓--我们将设置魔力3,每一个下一个位置都会有魔力3。

等...

 
Alexey Viktorov:

在这种情况下,最好设置一个Magik

在每次开仓/下单 之前,而不是在OnInit中。

原本是这样的,没有帮助。但在例子中,它通常在OnInit中,所以已经移动了。很长时间以来,我一直在捣鼓这个问题,测试中的猫头鹰似乎运行顺利,然后突然我打开服务器,一个方向上有20个位置。事实上,对空缺职位的检查可以不通过班级吗?

 
Pavel Nikiforov:

谢谢你的快速回复。但这就是问题所在,魔术师是不同的。于是我发现,第二个机器人是用第一个机器人的神奇数字开仓的。我不知道它是如何发生的,也不知道他在哪里先保存了EA的神奇数字,但我想弄清楚。

由于CTrade类中没有GetExpertMagicNumber 方法,请在交易操作 后打印此代码。

Print("Expert name: ",__FILE__,", magic: ",IntegerToString(m_trade.RequestMagic());

这样你就可以检查两个EA是否有不同的魔力。

原因: