初学者的问题 MQL4 MT4 MetaTrader 4 - 页 128

 
Anatoliy Ryzhakov:

卖出订单以卖出价收盘

我有点糊涂了!指向代码中的错误所在!!!(日志上写着ORDER CLOSE ERROR 4108) 提前感谢!

 

鉴赏家们下午好!你是否已经用尽了一年中最艰难的一天?我们可以谈正事了吗?;=).

我画了一个EA,一切都很好,但据我所知,MQL在MT4环境下工作。我希望它能与直接与交易所合作的软件一起工作。是否有其他的MQL编译器?如果不是,我应该用什么语言来重写MQL

 
STARIJ:

你有一个休息时间,你需要继续。

我没有休息。是什么原因导致EA可能无法 "看到 "其订单?我有不同的服务器 和电脑时间,也许是因为这个原因?

 
Anatoliy Ryzhakov: 我没有休息。EA无法 "看到 "其订单的原因是什么?我的服务器时间和我的电脑时间是不同的。

每个人的时间是不同的。从远处开始,不要急于求成。1.看看OrdersTotal函数 给你提供了什么。它的值取决于历史设置:今天,过去3天,上周,......根据你的喜好调整。 2.然后创建一个周期,输出所有带有警报 的订单。这就是所谓的调试--它是程序员工作的一个非常重要的部分。比写代码更重要。

 
请告知如何解决EA中FreeMarginCheck功能在不小心设置负量(手)值时出现的无效手数错误。在测试器中要有一个关于错误批次的信息,没有错误信息

 
STARIJ:

每个人的时间是不同的。从远处开始,不要急于求成。1.检查OrdersTotal函数 给你的信息。它的值取决于历史设置:今天,过去3天,上周,......按你的要求调整。 2.然后创建一个周期,用Alert输出所有订单。这就是所谓的调试--它是程序员工作的一个非常重要的部分。比写代码更重要。

谢谢你!

 

你们能告诉我如何在专家顾问的代码中写出一次开立3笔交易并能设置SL的功能吗?

以下是我的情况

if(MA_1>MA_2)
ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
if(MA_1<MA_2)
ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);

有人建议我使用(OrdersTotal()) 函数,但它并不适合我的情况。我是这样安排的

void OnTick()
  {
//---
   double MA_1;
   MA_1=iMA(_Symbol,0,1,0,1,0,0);
   double MA_2;
   MA_2=iMA(_Symbol,0,6,0,1,0,0);
   int ticket=0;
   if(OrdersTotal()<=3)
     {
      if(MA_1>MA_2)
         ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
      if(MA_1<MA_2)
         ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);
     }
//---
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

它编译得很好,没有错误,但它不适合我的情况。

我发现以下代码

#property copyright "Влад Сергеев для mmgp" 
#property version   "1.00" 
#property strict 
#property script_show_inputs 

input int      orders = 4;      //всего ордеров в серии 
input bool     buy = true;      //флаг разрешающий/запрещающий покупки 
input bool     sell = false;    //флаг разрешающий/запрещающий продажи 
input int      magic = 100500;  //уникальный номер для ордеров, открываемых этим скриптом 
input double   lot = 0.01;      //объем каждого ордера серии 
input int      tp = 100;        //тейк профит, в пунктах 
input int      sl = 100;        //стоп лосс, в пунктах 
input int      slip = 2;        //допустимое проскальзывание на открытии, в пунктах (для ECN, где открытие по рынку - игнор) 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int i=0;  // для чего эта переменная
   int ticket=0;
   if(buy) 
     {
      while(i<orders) // здесь эта переменная используется чтобы сравнивать ордера или для чего
        {
         RefreshRates(); // если убрать эту функцию коду хуже не становится
         ticket=OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,Digits),slip,0,0,"",magic,0,clrBlue); //здесь понятно
         if(ticket!=-1) // эта строчка тоже не понятна
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  // функция для выбора ордера это логично но тоже не понятно как ей пользоваться
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl*Point,Digits),NormalizeDouble(OrderOpenPrice()+tp*Point,Digits),0,clrBlue);
               // эту строчку тоже хотел бы чтобы объяснили
              }
           }
         i++; // что увеличивается на оду единицу это относится к магическому номеру ордера чтобы программа понимала что у неё есть ордера
        }
     }
   i=0;
   if(sell) // прошлая запись была для покупак эта для продаж 
     {
      while(i<orders) 
        {
         RefreshRates();
         ticket=OrderSend(Symbol(),OP_SELL,lot,NormalizeDouble(Bid,Digits),slip,0,0,"",magic,0,clrRed);
         if(ticket!=-1) 
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl*Point,Digits),NormalizeDouble(OrderOpenPrice()-tp*Point,Digits),0,clrRed);
              }
           }
         i++;
        }
     }
  }  
//+------------------------------------------------------------------+

也许可以使用,但我不明白字符串的含义。在改写成适合我的条件时,可以使用这个代码吗?

 
Seric29:

你们能告诉我如何在专家顾问的代码中写上一次开3笔交易,并能设置SL吗?

以下是我的情况

有人建议我使用(OrdersTotal())函数,但它并不适合我的情况。我是这样安排的

它编译得很好,没有错误,但它不适合我的情况。

我发现以下代码

也许可以使用,但我不明白字符串的含义。如果我重写这段代码以适应我的条件,我可以使用它吗?

试试这个方法

pos=0; //顺序计数器

for(int i=OrdersTotal()-1;i>=0;i--) //读取市场订单

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))继续;//从市场订单中选择。

{

如果(OrderSymbol()!=Symbol()&&OrderMagicNumber()!=Magic)继续;//只选择EA订单(如果有Magic并且它在任何货币对上交易)。

pos++; //如果选择了,就增加一个位置。

}

}

 if(MA_1>MA_2&&pos<3)
 OrderSend(_Symbol(),OP_BUY,Lots,Ask,0,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,clrGreen);
 if(MA_1<MA_2&&pos<3)
 OrderSend(_Symbol(),OP_SELL,Lots,Bid,0,Bid+SL*Point,Bid-TP*Point,NULL,Magic,0,clrRed);

 
相当有趣的论坛。很多有启发性的东西!)
 
Seric29:

你们能告诉我如何在EA的代码中写出一次开3笔交易并能设置SL的功能吗?

if(MA_1>MA_2)
     for(int i=0; i<3; i++)
          tiket = OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-(i==0?SL_1:i==1?SL_2:SL_3)*Point,Bid+TP*Point,NULL,0,0,clrGreen);
if(MA_1<MA_2)
     for(int i=0; i<3; i++)
          tiket = OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+(i==0?SL_1:i==1?SL_2:SL_3)*Point,Ask-TP*Point,NULL,0,0,clrRed);