MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 239

 
Vyacheslav Kornev :

도와주셔서 감사합니다만, 실제 거래에서는 가격을 어떻게 받아들여야 하는지 별 차이가 없나요? 결국 차트에 지표와 어드바이저를 모두 던져야 합니까?

실제일 때 데이터를 수신할 수 있습니다. 실수로 표시선을 제거하지 않으면 ...

 
Artyom Trishkin :

실제일 때 데이터를 수신할 수 있습니다. 실수로 표시선을 제거하지 않으면 ...


Tx, 다른 질문이 있습니다. 멋진 조언자가 되었습니다. 하지만 이렇게 해야 합니다. 일반적으로 선을 넘을 때 이 방향으로 추가 주문을 열고 차익으로 청산합니다. 차익으로 청산한 후 추가 주문이 다시 열리지 않도록 하는 방법은 무엇입니까? 표시줄이 업데이트될 때까지?

//==================추가 주문 설정 =============
이중 랏2;
if((PriceHigh>PriceLow && Ask>PriceHigh && LBUY<LSELL)|| (PriceLow>PriceHigh && Ask>PriceLow && LBUY<LSELL) )
 

안녕하세요! 다음과 같은 코드에 약간의 도움이 필요합니다.

파일 11112222.txt에 1이 포함되어 있으면 BUY를 엽니다.

-1이 11112222.txt 파일에 쓰여지면 SELL을 엽니다.

파일 11112222.txt에 0이 포함되어 있으면 모든 주문을 닫습니다.


11112222.txt 파일이 제공되며 여기에는 1, -1 또는 0의 세 가지 항목만 있을 수 있습니다.


어떤 이유로 11112222.txt 파일의 0에서 BUY 주문이 열려 있지만 주문 닫기 코드가 작동해야 오류가 무엇인지 이해할 수 없습니다.

그래서 문제가 있습니다. 어드바이저가 실행 중일 때 11112222.txt를 여는 것이 거의 항상 불가능합니다. 파일이 다른 응용 프로그램에 의해 점유되고 있으므로이 문제를 해결하기 위해 모든 곳을 찔렀습니다. "FileClose(handle2); // 텍스트 파일 닫기", 하지만 도움이 되지는 않지만 조언자 가 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를 엽니다.

-1이 11112222.txt 파일에 쓰여지면 SELL을 엽니다.

파일 11112222.txt에 0이 포함되어 있으면 모든 주문을 닫습니다.


11112222.txt 파일이 제공되며 여기에는 1, -1 또는 0의 세 가지 항목만 있을 수 있습니다.


어떤 이유로 11112222.txt 파일의 0에서 BUY 주문이 열려 있지만 주문 닫기 코드가 작동해야 오류가 무엇인지 이해할 수 없습니다.

그래서 문제가 있습니다. 어드바이저가 실행 중일 때 11112222.txt를 여는 것이 거의 항상 불가능합니다. 파일이 다른 응용 프로그램에 의해 점유되고 있으므로이 문제를 해결하기 위해 모든 곳을 찔렀습니다. "FileClose(handle2); // 텍스트 파일 닫기" 하지만 도움이 되지는 않지만 조언자 가 11112222.txt 파일 을 연 후 내용을 1, -1 또는 0으로 확인한 다음 다른 프로그램에서 이 파일을 사용하므로 즉시 닫아야 합니다. 1, -1 또는 0을 쓰기 위해 1초마다 .

파일 핸들이 파일의 내용이 아니기 때문입니다.

먼저 파일의 내용을 읽은 다음 조건을 설정해야 합니다. 그리고 핸들에 반대 조건이 있고 파일을 읽고 닫습니다.

 
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) - 핸들2>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 :

"거래가 허용되지 않는 .."이유에 대해 자세히 설명해 주시겠습니까?

오류에 대한 검사가 없으며 갑자기 폐쇄가 있고 서버가 치명적인 오류 를 제공하는 경우 고문은 계속해서 서버를 망치고 이는 후속 자동 거래에 대한 DC의 금지와 같은 냄새가 납니다.