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

 
lil_lil:

FileSeek(File,0,SEEK_END);并且所有的东西都从新的一行 写到文件中。

问题是有4个文件,我们需要在4个位置上写数据,每个文件都是独立的,每个文件的名称中都有一个位置票,但数据只写到一个,即最后一个文件,最后一个位置上的数据。

文件名的形成是否正确?不写Ticket=OrderTicket(); File name=_Ticket+Symbol()+".txt"; 而写File name=(string)OrderTicket()+Symbol()+".txt"; 并在开头添加#property strict指令--有助于消除错误。
 
STARIJ:
文件名的形成是否正确?我不写Ticket=OrderTicket(); File name=_Ticket+Symbol()+".txt",而是写File name=(string)OrderTicket()+Symbol()+".txt";并在开头添加#property strict指令--有助于消除错误。

谢谢你,根据你的建议重新做了名称形成,但还是只写了最后一个位置的数据。

而且,新文件的名称没有变化)我怀疑不是名称的问题,反正最后一个位置的文件被找到了。

为什么它忽略了以前的位置?

 

1501896125EURUSD.txt
时间 半数 投标价格
2018.02.22 22:53 P 1,23259 0,88322
2018.02.22 22:54 P 1,23259 0,88322
2018.02.22 22:55 P 1,23259 0,88322
2018.02.22 22:56 P 1,23249 0,88322

1501896094EURUSD.txt
时间 半数 投标价格
2018.02.22 22:43 L 1,23212 1,23203
2018.02.22 22:44 L 1,23220 1,23203
2018.02.22 22:44 L 1,23224 1,23203
2018.02.22 22:45 L 1,23244 1,23203
2018.02.22 22:45 L 1,23242 1,23203
2018.02.22 22:46 L 1,23251 1,23203
看......这个:字符串sy="";int op=-1, mn=-1;几乎不需要。我们可以放弃吗?在循环中,与其嵌套if(),不如继续。

附加的文件:
Fileee.mq4  7 kb
 
STARIJ:

1501896125EURUSD.txt
时间 半数出价
2018.02.22.02.22 22:53 P 1,23259 0,88322
2018.02.22 22:54 P 1,23259 0,88322
2018.02.22 22:55 P 1,23259 0,88322
2018.02.22 22:56 P 1,23249 0,88322

1501896094EURUSD.txt
Time Half BID Price
2018.02.22:43 l 1,23212 1,23203
2018.02.22 22:44 l 1,23220 1,23203
2018.02.22 22:44 l 1,23224 1,23203
2018.02.22 22:45 l 1,23244 1,23203
2018.02.02.22 22:45 L 1,23242 1,23203
2018.02.22 22:46 L 1,23251 1,23203
有什么变化吗?看...this: string sy=""; int op=-1, mn=-1; hardly needed ...我们可以放弃吗?在循环中,与其嵌套if(),不如继续。

它不想写在所有的位置上。

目前有7个职位空缺。我已经写了一个文件。

当我的EA在一个图表上开始写第一个和最后一个头寸的数据时,我已经编好了它。现在我只有一个数据,来自第一个位置。

我看不到六个,但我在Alert(NameFile)里有所有的刻度。

它需要什么...

 
程序中有许多条件,包括必须满足的条件,才能写入文件。
如果(t_pre+60<TimeCurrent()&& _o_t+1800>TimeCurrent()) //从订单开始每半小时一次。这有必要吗?
{
t_pre=TimeCurrent();
该程序包含的后果。
  for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if(OrderSymbol()==sy || sy=="") 
           {
            if(OrderType()==OP_BUY || 
               OrderType()==OP_SELL) 
              {
               if(op<0 || OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     _o_t=OrderOpenTime();
И еще 5 закрывающих скобок. а можно короче на 10 строк и понятнее записать так
  for(i=0; i<k; i++) 
  {
     if( ! OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; // если ошибка выбора ордера - переходим к следующему
     if(OrderSymbol()!=sy && sy!="") continue;   // а это вообще надо?
     if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue; // а другие разве у Вас есть?
     if(op>=0 && OrderType()!=op) continue;
     if(mn>=0 && OrderMagicNumber()!=mn) continue;
     _o_t=OrderOpenTime();
之前把它写在楼梯上的目的是什么?在旧版本的MQL4中,它加快了执行速度。现在已经不重要了
变量_o_t只在2处使用。如果我们用OrderOpenTime()代替它,程序就会变得更清晰、更短,只有2行(声明和赋值)
datetime _o_t; 和
_o_t=OrderOpenTime()。
 

我知道了--60秒的倒计时必须从循环中取出来

//+------------------------------------------------------------------+ 
//| Ежеминутная информация об ордерах, открытых за последнее полчаса | 
//+------------------------------------------------------------------+ 
#property strict
bool RUS=true;
datetime t_pre=0;  // Время предыдущего выполнения

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
   if(t_pre+60>=TimeCurrent()) return;      // Дождаться 60 секунд после прошлой обработки
   t_pre=TimeCurrent();                     // Это нужно вынести за цикл - в этом было дело !!!!!!!!!!!!

   string text;
   for(int i=0; i<OrdersTotal(); i++) 
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
      string ИмяФайла=(string)OrderTicket()+Symbol()+".txt";
      Alert(ИмяФайла);
      if(OrderOpenTime()+60>=TimeCurrent()) continue;   // Пропуск молодых которым меньше 1 минуты
      if(OrderOpenTime()+1800<=TimeCurrent()) continue; // Пропустк старых которым больше 30 минут
      if(OrderType()==OP_BUY){if(Bid>OrderOpenPrice())text="P"; else text="L";}
      if(OrderType()==OP_SELL){if(Bid<OrderOpenPrice())text="P"; else text="L";}

      // Открытие или создание файла и перемещение указателя в конец
      int Файл= FileOpen(ИмяФайла,FILE_CSV|FILE_READ|FILE_WRITE," ");
      if(Файл == -1) {  Alert("Ошибка при открытии файла ",ИмяФайла);  return; }
      FileSeek(Файл,0,SEEK_END);

      // Если новый файл записать имя файла и строку заголовков колонок
      if(FileSize(Файл)==0)
      {
         FileWrite(Файл,ИмяФайла);
         FileWrite(Файл,"           Время Полу   BID     Цена ");
      }
      // Сбор информации и запись в файл
      FileWrite(Файл, TimeToStr(TimeCurrent()), text,
                dstr(Bid), "  ", dstr(OrderOpenPrice()));
      FileClose(Файл);
   }
}

// Преобразование числа double в строку с запятой или точкой в соответствии с локализацией
string dstr(double Цена)
{
   if(!RUS) return DoubleToStr(Цена, Digits);
   return StringSetChar(DoubleToStr(Цена, Digits), StringFind(DoubleToStr(Цена, Digits), "."), ',');
}
附加的文件:
-Fi----.mq4  5 kb
 

下午好,亲爱的论坛用户。

你能告诉我为什么相同设置的优化和测试有时会产生不同的结果?

我从SQ Tick Downloader下载报价,并通过脚本运行它们

 
Aidar Kaliaskar:

下午好,亲爱的朋友们。

你能告诉我为什么相同设置的优化和测试有时会产生不同的结果?

我再告诉你:当用一个经纪人的真实账户在2个不同的账户上交易时,可以得到不同的结果。
 
Vladislav Andruschenko:
我再告诉你:当用同一经纪人的真实账户在2个不同的账户上交易时,可能会有不同的结果。

这可能更取决于经纪人。但你能就最初的问题给我一个提示吗?

 
Aidar Kaliaskar:

这可能更取决于经纪人。但你能就最初的问题给出一些建议吗?

价差,如果按目前的价格计费。如果是按当前的测试结束日期计费。 可能还有很多原因。
原因: