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

 
Vyacheslav Kornev:

谢谢你的帮助,但在实际交易中,如何取价没有区别? 毕竟,你必须把指标和EA都放在图表上?

在真实的交易中,你将能够获得数据。只要你不意外地删除指标线...

 
Artyom Trishkin:

有了真实的,你就能接收数据。如果你没有不小心把指示线 移开...


所以,我还有一个问题。这是个很好的EA。但它需要这样做:当它越过一条线时,在这个方向上开出一个额外的订单,然后在盈利时关闭...如何使获利平仓后,不再开立额外的订单? 直到指标线被更新?

//================== 设置一个额外的订单 ============
双层Lots2。
if((PriceHigh>PriceLow &&Ask>PriceHigh &&LBUY<LSELL)|(PriceLow>PriceHigh &&Ask>PriceLow &&LBUY<LSELL) )
 

下午好!需要一点帮助的代码有哪些。

如果文件11112222.txt包含1,则打开BUY。

如果文件11112222.txt包含-1,则打开卖出。

如果文件11112222.txt包含0,则关闭所有订单。


给定文件11112222.txt,只能有三个条目:1、-1或0


我不明白这段代码有什么问题;由于某些原因,如果我在文件11112222.txt中看到0,就会打开BUY订单,而不是关闭订单代码,我只是不知道哪里出了问题。

唉,还有一个问题,当EA运行时,几乎总是无法打开11112222.txt,它说该文件正被另一个程序忙着,所以为了解决这个问题,我把" FileClose(handle2); //关闭文本文件 "放在所有地方,但它没有帮助,我需要EA在文件 11112222.txt被打开 后检查1、-1或0,然后关闭它,因为该文件被另一个程序定期使用,记录1、-1或0。

//=================================BUY=========================================
    int handle2 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle2>0) // если в файле больше 0, то есть 1, то открывать BUY
   {
    
       Print(FileReadString(handle2));
       FileClose(handle2); // закрытие текстового файла

                    //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ      
                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на покупку
                     {
                        OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                        FileClose(handle2); // закрытие текстового файла
                     }
                    else
                      Print("NE USPESHNO!!!");
                      FileClose(handle2); // закрытие текстового файла

   }
//=================================конец кода BUY=========================================
      
      
      
      
      
      
      
      
//=================================SELL=========================================
    int handle3 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle3<0)//если в текстовом файле меньше 0, то есть -1, то открывать SELL
   {
    
       Print(FileReadString(handle3));
       FileClose(handle3); // закрытие текстового файла

                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на продажу
                        {
                           OrderSend(Symbol(), OP_SELL, 0.01, Bid, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                           FileClose(handle3); // закрытие текстового файла
                        }
                       else
                       Print("NE USPESHNO!!!");
                       FileClose(handle3); // закрытие текстового файла

   }
//=================================конец кода SELL=========================================
      
      
      
      
      
//=================================ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ=========================================
    int handle4 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle4=0)//если в текстовом файле равно 0, то закрыть все ордера
   {
      
       Print(FileReadString(handle4));
       FileClose(handle4); // закрытие текстового файла
//-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;

 while (OrdersTotal()>0)
 {
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {   if(OrderType()==OP_BUY)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
           OrderDelete(OrderTicket());
          
           if(result!=TRUE) { error=GetLastError();
              Print("LastError = ",error, " ",Symbol()); }
           else error=0; }
   else Print( "Error when order select ", GetLastError());
         
         FileClose(handle4); // закрытие текстового файла
  }
//------------конец кода закрывающего ордера------------------
 

         FileClose(handle4); // закрытие текстового файла
      
      
   }
//=================================конец кода ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ=========================================


 
Санек:

下午好!需要一点帮助的代码有哪些。

如果文件11112222.txt包含1,则打开BUY。

如果文件11112222.txt包含-1,则打开卖出。

如果文件11112222.txt包含0,则关闭所有订单。


给出文件11112222.txt,它可能只有三个条目:1、-1或0。


由于某些原因,当0在文件11112222.txt中时,它打开了BUY订单,而它应该触发订单关闭代码;我不明白错误是什么。

所以,还有一个问题,当EA运行时,几乎总是无法打开11112222.txt,因为它说这个文件正被另一个程序忙着。 我把FileClose(handle2); //关闭文本文件;但它不起作用,我需要EA检查11112222.txt文件 的1、-1或0并关闭它,因为每一秒都有另一个程序使用这个文件,把1、-1或0放在里面。

因为文件柄不是文件内容。

你必须先读取文件的内容,然后才能设置条件。反过来说,你通过句柄有一个条件,然后读取文件并关闭它。

 
Alexey Viktorov:

因为文件的句柄不是文件的内容。

你必须先读取文件的内容,然后才提出条件。在你的例子中,情况正好相反,通过句柄的条件,然后读取文件并关闭它。

1) - 这一部分打开文件11112222.txt,从其中读取数据。

//=================================BUY=========================================
    int handle2 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения

2) - 接下来是如果handle2>0的条件


  if(handle2>0) // если в файле больше 0, то есть 1, то открывать BUY
   {

3) - 这是我不明白的部分。


       Print(FileReadString(handle2));

4) - 这一部分关闭了文件。


       FileClose(handle2); // закрытие текстового файла

5) - 由于满足handle2>0的条件,即文件11112222.txt中含有1,它就会开出一个买入指令

  //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ      
                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на покупку
                     {
                        OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                        FileClose(handle2); // закрытие текстового файла
                     }
                    else
                      Print("NE USPESHNO!!!");
                      FileClose(handle2); // закрытие текстового файла

   }
//=================================конец кода BUY=========================================

我把哪些部分搞混了?
 

问候试图写一个脚本来关闭订单。

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{  
   bool reasult;
   for (int i = OrdersTotal()-1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS)>0)
      {
         if (OrderSymbol() != Symbol())
            continue;
         
         switch (OrderType())
         {
            case OP_BUY  :
               reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
               if (!reasult) Print ("Ошибка закрытия ордера на покупку", GetLastError());
               break;
            case OP_SELL :
               reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
               if (!reasult) Print ("Ошибка закрытия ордера на продажу", GetLastError());
               break;
         }   
         
      }
   }
}

如果我交替开了几个卖单 和买单,并试图用这个订单关闭它们,只有几个被关闭,其余的得到错误129(价格不正确)。

我试图做一个脚本,例如根据订单的数量进行10次尝试,在出现错误时暂停。

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{ 
   int c=CountTrades()*10;
   
   for ( int a=1 ; a<=c; a++)
   {
   if (CountTrades()==0) { Print ("Orders are successfully closed! Break."); break;}
    Print("Try ", a, " out of ", c);
      
      bool reasult;
      for (int i = OrdersTotal()-1; i >= 0; i--)
      {
         if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == Symbol()) 
            
            {      
            
            if (OrderType() == OP_BUY)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
                  if (!reasult) {Print ("ERROR ", GetLastError());} 
                  }
            if (OrderType() == OP_SELL)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
                  if (!reasult) {Print ("ERROR ", GetLastError());}  
                  }              
            }   
            
         }
      }Sleep(1000);
   }   
}
//+------------------------------------------------------------------+
int CountTrades()
{
    int count=0;
    for (int i=OrdersTotal()-1; i>=0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
           if (OrderSymbol() == Symbol())
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                 count++;
        }
    }
    
    return(count);
}

它通常在经过相当多的尝试后才完成任务,在这时会出现同样的129错误。但是,虽然它试图,经过多次尝试,关闭订单出可以手动关闭,这不会导致错误,他们关闭。

我做错了什么?

 
Andrey Sokolov:

问候试图写一个脚本来关闭订单。

如果我交替开了几个卖单 和买单,并试图用这个订单关闭它们,只有几个被关闭,其余的得到错误129(价格不正确)。

我试图做一个脚本,比如说,根据订单的数量进行10次尝试,在出现错误时暂停一下。

它通常在经过相当多的尝试后才完成任务,在这时会出现同样的129错误。但是,虽然它试图,经过多次尝试,关闭订单出可以手动关闭,这并不引起错误,他们关闭。

我做错了什么?

            RefreshRates(); // Попробуйте добавить
            if (OrderType() == OP_BUY)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
                  if (!reasult) {Print ("ERROR ", GetLastError());} 
                  }
            if (OrderType() == OP_SELL)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
                  if (!reasult) {Print ("ERROR ", GetLastError());}  
                  }  

一般来说,你写的东西是不允许在真实账户上交易的,它只适用于测试者。

 
Vitaly Muzichenko:

一般来说,你写的东西不应该被允许在真实账户中进行交易,它只适用于测试者。

            RefreshRates(); // Попробуйте добавить

这很有帮助,谢谢你。

 
Vitaly Muzichenko:

一般来说,你写的东西是不允许在真实账户上交易的,它只适用于测试者。


你能详细说明为什么 "不允许交易... "吗?

 
Andrey Sokolov:

你能否详细说明为什么 "不允许交易"?

没有检查错误,如果服务器关闭并产生一个关键错误,专家顾问仍将继续冲击服务器,这就有禁止进一步自动交易的味道。

原因: