[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 608

 
Tragedy:

大家又见面了。

如何在EA中对前次交易结束后开启新交易前进行时间延迟。

也就是说,交易结束后,我需要等待,例如15分钟,然后配方才会继续工作:)

发现

订单关闭时间( )
但我如何将其与程序时间联系起来,并使之与通过历史记录运行EA没有冲突。提前感谢


https://www.mql5.com/ru/forum/131859

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после открытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  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) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после закрытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterCloseLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  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()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) t=OrderCloseTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}
 
提示:) 谢谢你
 
rigonich:

intiHighest( string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0)
返回找到的最高值的索引(相对于当前条形图的偏移)。
参数。
该值将作为最高条的 返回。

intiHighest( string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0)
返回找到的最高值的索引(相对于当前条形图的偏移)。
参数。
标志 - 符号的名称,该符号的数据将被搜索到。NULL表示当前符号。
时限 - 期间。可以是图表 中的一个时期。0表示当前图表的周期。
类型 - 时间序列的标识符。可以是任何一个时间序列的标识符
- 时间序列的元素数量(在从当前条形图到升序索引的方向上),其中应执行搜索。
开始 - 开始搜索最高值的起始栏的索引(从当前栏的偏移量)。负值会被忽略并被零值取代。
这里的问题是,如何指定必须搜索到分形出现的条形上面,如果周期小于一分钟.....,应该如何做?
 

我很抱歉

那就好了。我看了全局变量 的教程,我明白这是我需要的,但我不明白其中的细微差别。在哪里声明它们,如何将正确的值写进它们,等等。

例如,如果有5个EA挂在5个不同的对上,每个EA有4个变量需要写入,这意味着我们需要20个全局变量,它们必须用Symbol()命令以某种方式命名,这样我就不必在EA中写入每个名称。

总而言之,它还不适合我的大脑()。

 
i999i:



记忆最后一个分形的开盘时间,用它来寻找这个条形的编号。如果周期小于一分钟,........,怎么会这样呢?如果图表的周期,不到一分钟是根本不存在的
 
i999i:

谢谢你的回答,但我的意思是,在下一个分形出现之前,如何知道当前的分形是否已经被破坏?

如果你寻找一个新的分形的价格(你可以在这个页面 上滚动鼠标轮),那么你就会知道这个分形是否被突破了。我的简介中有B.Williams ProfitUnity博览会 的链接。我自己写的。现在我通过反向信号进行交易,在价格回到移动平均线的方向上。
 
xant:

我很抱歉

那就好了。我看了全局变量的教程,我明白这是我需要的,但我不明白其中的细微差别。在哪里声明它们,如何将正确的值写进它们,等等。

例如,如果有5个EA挂在5个不同的对上,每个EA有4个变量需要写入,这意味着我们需要20个全局变量,它们必须用Symbol()命令以某种方式命名,这样我就不必在EA中写入每个名称。

总而言之,它还不适合我的大脑()。

如果我对终端的全局变量 没有足够的头脑,那么也要把它们写进一个文件里......

double Var1, Var2, Var3, Var4;  // 4-ре переменных для сохранения (у Вас они свои !!!)
void fSave_MineGV (string fs_PrefName = "")     // префикс имени переменной
{
    static datetime ldt_NewBar;
    datetime ldaTBeginBar = iTime (Symbol(), 1, 0);
//----
    //---- Сохраняемся в начале каждой минуты
    if (ldt_NewBar == ldaTBeginBar) return;
    ldt_NewBar = ldaTBeginBar;
    //---- Сохраняем поочереди значения каждой переменной
    string ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_1");
    GlobalVariableSet (ls_Name, Var1);
    ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_2");
    GlobalVariableSet (ls_Name, Var2);
    ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_3");
    GlobalVariableSet (ls_Name, Var3);
    ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_4");
    GlobalVariableSet (ls_Name, Var4);
//----
}
// в init()
void fGet_MineGV (string fs_PrefName = "")     // префикс имени переменной
{
    string ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_1");
//----
    //---- Восстанавливаем значения переменных
    if (GlobalVariableCheck (ls_Name)) Var1 = GlobalVariableGet (ls_Name);
    ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_2");
    if (GlobalVariableCheck (ls_Name)) Var2 = GlobalVariableGet (ls_Name);
    ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_3");
    if (GlobalVariableCheck (ls_Name)) Var3 = GlobalVariableGet (ls_Name);
    ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_4");
    if (GlobalVariableCheck (ls_Name)) Var4 = GlobalVariableGet (ls_Name);
//----
}

但是,凡事都有第一次。fSave_MineGV()在start()里面,fGet_MineGV()在init()里面。

我希望你能弄明白,并写出你的保存变量,而不是Var1,等等。
 
xant:

我很抱歉

那就好了。我看了全局变量的教程,我明白这是我需要的,但我不明白其中的细微差别。在哪里声明它们,如何在其中写入必要的值,等等。

例如,如果有5个EA挂在5个不同的对上,每个EA有4个变量需要写入,这意味着我们需要20个全局变量,它们必须用Symbol()命令以某种方式命名,这样我就不必在EA中写入每个名称。

好吧,这还不是为了我的大脑()。

你需要的变量真的是20个,你不要把它们写在你的EA中,把它变成一个单独的文件,有预处理器命令可以预先定义常量,对于初学者来说,使用全局变量 要比使用文件容易得多,当然,你是老板。

string perem = "peremEURUSD-1";
string perem = "peremEURUSD-2";
双A。
//+------------------------------------------------------------------+
//| 脚本程序启动功能|
//+------------------------------------------------------------------+
int start()
{
GlobalVariableSet(peremEURUSD-1,2.5); //创建或分配一个新值
A=GlobalVariableGet(peremEURUSD-1); //由此读取数值
如果(GlobalVariableGet(peremEURUSD-1)=....)//这样检查
return(0);
}

//+------------------------------------------------------------------+

P.S. 最好是在启动时预先定义变量(对于货币对)。

 

里戈尼奇。

为什么,在EA我只是想,我想相反,记录文件是更容易。

TarasBY ,

谢谢你,都清楚了,我试试,我想它会成功的。

 
请指示......到底......在其原始形式下(没有PlaySound("alert.wav");- 作品。但是,如果你在任何链接中添加除了分配标志和一些动作(例如播放音乐)......那么标志是打印0000,音乐是全速播放!请告诉我错误在哪里?
      if(Stoch_1>Stoch_2) flag1=1 ;  
      {Print (flag1,flag2,flag3,flag4);
      
      if(Stoch_1<Stoch_2 && flag1==1) flag2=1;
      {Print (flag1,flag2,flag3,flag4);
      
      if ((Stoch_1>Stoch_2) && flag1==1 && flag2==1) flag3=1; 
      {Print (flag1,flag2,flag3,flag4);PlaySound("alert.wav");
      
       if(Stoch_1<Stoch_2 && flag1==1 && flag2==1 &&  flag3==1) flag4=1;
              {Print (flag1,flag2,flag3,flag4);
       if(Stoch_1>Stoch_2 && flag1==1 && flag2==1 &&  flag3==1 && flag4==1) 
       {OrderSend (Symbol( ), OP_SELL,  0.01 ,Bid, 0, 0, 0, NULL, 450, 0, CLR_NONE);
        Print ("OUT");


 
flag1=0;
flag2=0;
flag3=0;
flag4=0;}

}}     
  }}}
=================================================================
.....