[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 285

 
rid >> :

也许函数https://www.mql5.com/ru/forum/107476/page21 可以提供帮助。

函数isCloseLastPosByTake()。
该函数返回一个关闭最后一个位置的标志。

Flag up - True - TakeProfit被触发了。

旗帜降低 - 虚假 - 职位因其他原因被关闭。


该函数本身应该放在代码的最后。我还在条件中加入了出售。


祝你们所有的人日安、晚安或早安。

我所做的一切都是按照我写的。我把这个功能放在代码的最后,并把它加入到我的销售条件中。

if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {//продаем

我只是想到了这一点,并为购买而添加了它。订单不仅会被BUY关闭,也会被SHELL关闭。

我在最后插入了isCloseLasPosByTake()函数。

2;116;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;104:33;'(' - function definition unexpected
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:7;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:14;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:27;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:33;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:15;'op' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:37;'op' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:17;'mn' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:46;'mn' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;116:19;'t' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;117:17;'t' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;127:19;'sy' - variable not defined

这里有这样一个馅饼,或者像刚才说的PFC Gotsman油画。请帮助假人出来....,什么都不知道.......。

代码本身(即只是开始)

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
    // Узнаем уровень стопов и спрэд
    int Spread = MarketInfo(Symbol(), MODE_SPREAD);
    int StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);

    // Рассчитываем значения средних на 0-ом и 1-ом барах
    double MAF_0 = iMA(NULL, 0, MAFP, 0, 1, 1, 0);
    double MAF_1 = iMA(NULL, 0, MAFP, 0, 1, 1, 1);
    double MAS_0 = iMA(NULL, 0, MASP, 0, 1, 1, 0);
    double MAS_1 = iMA(NULL, 0, MASP, 0, 1, 1, 1);
    
    // открытие позиции Buy покупка
    if( MAF_1 < MAS_1 && MAF_0 > MAS_0)
    if( isCloseLastPosByTake( NULL, OP_SELL, MagicNumber) ==true) {//покупаем
     if( CheckOrders(OP_SELL))
      {
       if( StopLoss <= StopLevel+ Spread)
         double SL = 0;
        else
         SL = Ask - StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         double TP = 0;
        else
         TP = Ask + TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Buy. Ошибка №", GetLastError()); 
       }
    
    // Открытие позиции Sell продажа  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {//продаем
     if( CheckOrders(OP_BUY))
      {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;
        else
         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;
        else
         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
       }
       bool isCloseLastPosByTake(string sy=NULL, int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, 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==NULL) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderCloseTime()) {
                t=OrderCloseTime();
                j= i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect( j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo( sy, MODE_DIGITS);
    if ( dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if ( ocp== otp) return( True);
  }
  return( False);
}
//----
   return(0);
  }//+------------------------------------------------------------------+
 
igrok2008 >> :


我在我的帖子中特别写道。这个函数isCloseLastPosByTake() - 必须放在代码的最后,在START FUNCTION之前!

那你把它放在哪里了?

并在买卖条件中多注意用大括号。你那里显然缺少它们(检查--开放括号的数量等于封闭括号的数量)。这里纠正了销售。

    //  ----- Открытие позиции Sell продажа------------  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {
     if( CheckOrders(OP_BUY))                                     {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;        else         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;        else         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
                 }
                }
               }
      //---конец блока продажи ------------------------------
 

日安!!!。


我需要一些帮助!我为自己的不谦虚而道歉。

但我的问题是,我有一个基于马丁的EA,它把第一笔订单放在卖出或买入,无论我想要什么,但我希望能够在EA属性中选择买入或卖出。例如,我在其属性中输入 "买入",它就会打开一个只买入的订单,或者相反。

恐怕我还没有学会如何用 MQL4 编程


我在此附上顾问本身。


提前感谢那些愿意回答的人!

 
rid >> :

我在我的帖子中特别写道。这个函数isCloseLastPosByTake() - 必须放在代码的最后,在START FUNCTION之前!

那你把它放在哪里了?

而且在买卖条件中要小心使用大括号。你那里显然缺少它们(检查--开放括号的数量等于封闭括号的数量)。这里是销售的修复:


我把它放在了开始fi之后,我明白.....。

那我就搞错了,谢谢你的指点 :-))

如果我没弄错的话,它应该放在专家去初始化功能块??????? 的末尾的 } 之后,或者放在 start-??????? 的末尾的 return(0); 之后。

提前感谢您的耐心!!!!!!!!!

 
igrok2008 >> :

我把它放在了启动功能之后,所以我明白.....。

我弄错了,谢谢你的指点 :-))

如果我理解正确的话,它应该放在专家去初始化功能块??????? 的末尾的 } 之后,或者放在 start-??????? 的最末端的 return(0);之后。

提前感谢您的耐心!!!!!!!!!

它必须放在外面。不是在任何函数里面,而是作为一个单独的独立函数。

像这样。

int start()
  {
//----
    // Узнаем уровень стопов и спрэд
    int Spread = MarketInfo(Symbol(), MODE_SPREAD);
    int StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);

    // Рассчитываем значения средних на 0-ом и 1-ом барах
    double MAF_0 = iMA(NULL, 0, MAFP, 0, 1, 1, 0);
    double MAF_1 = iMA(NULL, 0, MAFP, 0, 1, 1, 1);
    double MAS_0 = iMA(NULL, 0, MASP, 0, 1, 1, 0);
    double MAS_1 = iMA(NULL, 0, MASP, 0, 1, 1, 1);
    
    // открытие позиции Buy покупка
    if( MAF_1 < MAS_1 && MAF_0 > MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_SELL, MagicNumber) ==true) {
     if( CheckOrders(OP_SELL))                                      {
       if( StopLoss <= StopLevel+ Spread)
         double SL = 0;        else         SL = Ask - StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         double TP = 0;        else         TP = Ask + TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Buy. Ошибка №", GetLastError()); 
                }
               }
              }
//-------------------Конец покупки -----------------------

    //  ----- Открытие позиции Sell продажа------------  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {
     if( CheckOrders(OP_BUY))                                     {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;        else         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;        else         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
                 }
                }
               }
      //---конец блока продажи ------------------------------
    
//----
   return(0);
  }//+----------КОНЕЦ ФУНКЦИИ СТАРТ -------------------+


//ЖЖЖЖЖЖЖ Другие вызываемые пользовательские функции ЖЖЖЖЖЖ

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия           |
//|  последней позиции по тейку.                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, 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();
                j= i;
              }} }}}}}

  if (OrderSelect( j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo( sy, MODE_DIGITS);
    if ( dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if ( ocp== otp) return( True);
  }
  return( False);
}


我不确定在这些条件下,专家顾问会不会工作。因为最开始的位置将无法打开...

函数isCloseLastPosByTake()应该从买入或卖出条件中删除。

那么顾问就会发挥作用。

 
Rover82 >> :

日安!!!"。

但我的问题是,我有一个基于马丁的EA,它把第一笔订单放在卖出或买入,无论我想要什么,但我希望能够在EA属性中选择买入或卖出。例如,我在其属性中输入 "买入",它就会打开一个只买入的订单,反之亦然。

我附上了EA本身。

提前感谢每个人的答复


不太可能有人会回应。该EA是反编译的(黑客),这样的文件在这里是不受欢迎的...

 
WinExec("C:\\Program Files\\Opera\\opera.exe http://www.mail.ru",2);
大家好,这是用特定的浏览器启动链接,但我如何在默认情况下启动相同的链接?
 
即用默认浏览器
 
Dimoncheg >> :
也就是默认的浏览器

ShellExecute,即 "打开 "命令,就像它一样。

 

我已经决定研究MQL 4,因为我所找到的一切都不能满足我的愿望。目前,我正在研究 ,以便了解专业人士的工作方式,并为我的想法进行改进。有一个(简单的、小的、一页的)自定义函数,代码附后。 由于我的外行,我两天都不能理解--这个函数返回的结果是什么,哪个嵌套条件是Else?

有没有人愿意在我的沉闷中植入知识的火花?

我得到的是这样的结果。

函数 的目的是确定是否已经有一个为该对下的订单,如果有,则确定其类型。

调用该函数的函数等待在程序中选择的订单之一的出现 开关 该函数应返回 "1",在有两个 订单的情况下-"2",在没有订单的情况下-1"。

循环开始,如果 l_pos_16= 0.让我们假设我们对一些货币对总共有四个挂单, ,包括EA工作的货币对的两个挂单,而且它们不是第一个。

然而,在循环的第一次迭代中,函数 如果(OrderSelect(l_pos_16,SELECT_BY_POS,MODE_TRADES)) 检查订单列表中数字为 "0 "的位置,但没有这样的位置(因为我知道编号是从位置1开始的),然后它将传递到下一个位置。 否则 与完全退出 fCountOrders(int&a_count_0,int&a_count_4,int& a_count_8,int&a_count_12) 价值的返回返回(-1)。

整个函数的意义就失去了,因为不管 ,无论给定的一对订单存在与否,结果都应该是一样的。

然而,当EA工作时,这个函数定义并给你被调用的函数对它的期望,然后根据获得的结果工作

我也不明白什么是 else Return(-1) 将在

如果(OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)){

或者 相同的 如果(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N) {

函数的代码

int fCountOrders(int &a_count_0, int &a_count_4, int &a_count_8, int &a_count_12)

a_count_0= 0。

a_count_4 = 0。

a_count_8 = 0。

a_count_12 = 0。

gi_252 = 0。

for (int l_pos_16 = 0; l_pos_16 < OrdersTotal(); l_pos_16++){

如果(OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)){

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N) {

switch (OrderType() ) case OP_BUY:

a_count_0++;

gi_252 = 1。

g_ticket_268 = OrderTicket()。

gs_272 = OrderComment()。

g_ord_open_price_256 = OrderOpenPrice()。

g_ord_stoploss_288 = OrderStopLoss()。

g_ord_takeprofit_296 = OrderTakeProfit()。

突破。

case OP_SELL:

a_count_4++;

gi_252 = -1。

g_ticket_268 = OrderTicket()。

gs_272 = OrderComment()。

g_ord_open_price_256 = OrderOpenPrice()。

g_ord_stoploss_288 = OrderStopLoss()。

g_ord_takeprofit_296 = OrderTakeProfit()。

突破。

case OP_BUYSTOP:

a_count_8++;

突破。

case OP_SELLSTOP:

a_count_12++;

}

}

} else return (-1);

}

返回(a_count_0 + a_count_4 + a_count_8 + a_count_12)。

/*正常执行f-i将在变量 中的一个返回1。 案例 "0 "在所有其他的,这 ,表明有一个的

的订单类型,而这个订单的编号对调用函数是可用的。

评论、开盘价、止损和止盈 */

}