초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 246

 

안녕하세요. 아마도 많은 사람들에게 내 질문은 엄청나게 어리석은 것처럼 보일 것입니다. 죄송합니다. 나는 여전히 이 문제에 있어서 찻주전자입니다. 문제가 무엇인지 판단할 수 없습니다.

MQL5\Files\date.txt 폴더에 텍스트 파일을 생성했는데 열 수 없습니다. 오류 5004를 씁니다. 어렵지 않다면 도와주세요.

 #property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property version    "1.00"

int OnInit ()
  {
   return ( 0 );
  }
  
void OnDeinit ( const int reason)
  {
   return ;
  }
  
void OnTick ()
  {
   ResetLastError ();
   int Handle= FileOpen ( "date.txt" , FILE_CSV | FILE_READ | FILE_WRITE | FILE_COMMON , ';' );
   if (Handle==- 1 )   
     { 
     Print ( "Файл не открыт, ошибка: " , GetLastError ());     
     }
   return ;
  }
 
olegin038 :

안녕하세요. 아마도 많은 사람들에게 내 질문은 엄청나게 어리석은 것처럼 보일 것입니다. 죄송합니다. 나는 여전히 이 문제에 있어서 찻주전자입니다. 문제가 무엇인지 판단할 수 없습니다.

MQL5\Files\date.txt 폴더에 텍스트 파일을 생성했는데 열 수 없습니다. 오류 5004를 씁니다. 어렵지 않다면 도와주세요.

파일이 MT5 클라이언트 터미널의 공유 폴더에 없으면(귀하의 경우에는)

그런 다음 FILE_COMMON 플래그를 제거해야 합니다.

 void OnTick ()
  {
   ResetLastError ();
   int Handle= FileOpen ( "date.txt" , FILE_CSV | FILE_READ | FILE_WRITE , ';' );
   if (Handle==- 1 )   
     { 
     Print ( "Файл не открыт, ошибка: " , GetLastError ());     
     }
   return ;
  }
 
Fleder :

파일이 MT5 클라이언트 터미널의 공유 폴더에 없으면(귀하의 경우에는)

그런 다음 FILE_COMMON 플래그를 제거해야 합니다.

도와주셔서 감사합니다. 하지만 안타깝게도 작동하지 않았습니다. 나는 플래그로 많은 옵션을 시도했습니다. 또한 오류 5004를 작성합니다. 다른 시도를 하시겠습니까?
 
olegin038 :
도와주셔서 감사합니다. 하지만 안타깝게도 작동하지 않았습니다. 나는 플래그로 많은 옵션을 시도했습니다. 또한 그는 오류 5004를 작성합니다. 시도할 다른 것이 있습니까?

텍스트로 열어보십시오.

 void OnTick ()
  {
   ResetLastError ();
   int Handle= FileOpen ( "date.txt" , FILE_TXT | FILE_READ | FILE_WRITE );
   if (Handle==- 1 )   
     { 
     Print ( "Файл не открыт, ошибка: " , GetLastError ());     
     }
   return ;
  }
 
Fleder :

텍스트로 열어보십시오.

그것도 작동하지 않았다. 나는 이전에 파일 작업을 한 적이 없습니다. 여기에 추가로 작성해야 할 사항이 있습니까?
 
olegin038 :
그것도 작동하지 않았다. 나는 이전에 파일 작업을 한 적이 없습니다. 여기에 추가로 작성해야 할 사항이 있습니까?

예, 파일을 닫아야 합니다.

 void OnTick ()
  {
   ResetLastError ();
   int Handle= FileOpen ( "date.txt" , FILE_CSV | FILE_READ | FILE_WRITE , ';' );
   if (Handle==- 1 )   
     { 
     Print ( "Файл не открыт, ошибка: " , GetLastError ());     
     }
   FileClose (Handle);
   return ;
  }
 
정말 감사합니다! 정말 도움이 되었습니다. 더 이상 오류가 발생하지 않습니다.
 
개인 도서관의 저명한 작가들의 강의를 공유합니다.
Erin, Bazhenov, Strmzh, Lukyanov, Cheryomushkin, Gerchik, Alex Million 등
이 저자의 거의 모든 과정.
묻다.

 
Abramboss :
개인 도서관의 저명한 작가들의 강의를 공유합니다.
Erin, Bazhenov, Strmzh, Lukyanov, Cheryomushkin, Gerchik, Alex Million 등
이 저자의 거의 모든 과정.
묻다.

무료로 공유하시겠습니까? 게르치크에 관심이 있습니다.
 

안녕하세요! 잘 알려진 CrossArbitr 표시기에 대한 도움이 필요합니다. 물론 그 코드는 내 것이 아니다. 출력하지 않는 정보가 필요했습니다. 그래서 순서대로.

추가된 변수 double n, m;

"\n합성과 실제의 입찰가 차이 =", n=(CalcBid-Bid),

"\, 합성 및 실제 ASK 차이 =", m=(CalcAsk-Ask),

"\n총계 =" (m - n) <----

결과적으로 그는 이 괄호에서 마이너스로 맹세합니다(일부 오퍼레이터 예상). 내가 뭘 잘못하고 있는지 누가 말해 줄 수 있니?

 //+------------------------------------------------------------------+
//|                                                  CrossArbitr.mq4 |
//|                                                        Scriptong |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Scriptong"
#property link        ""

#property indicator_chart_window
//---- input parameters
extern bool       ShowBid= false ;
extern bool       ShowAsk= false ;
extern color      BidColor = Lime;
extern color      AskColor = Yellow;
extern int        AlarmIfPointDifference = 10 ;
extern string     AlarmFile = "wait.wav" ; 


bool Activate = False;
string FP, SP;
double Tick;
int WayForCross;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   string S = Symbol ();
   if ( StringFind (S, "USD" , 0 ) != - 1 )
     {
       Comment ( "Индикатор работает только с кроссовыми парами (GBPJPY, EURJPY, EURGBP и т. д)!" );
       return ( 0 );
     }

   if ( StringLen (S) != 6 )
     {
       Comment ( "Индикатор работает только с валютными парами, у которых название состоит из шести символов!" );
       return ( 0 );
     }
     
   // Поиск первой валютной пары кросса
   FP = StringSubstr (S, 0 , 3 )+ "USD" ;
   MarketInfo(FP, MODE_BID);
   if ( GetLastError () > 0 )
     {
      FP = "USD" + StringSubstr (S, 0 , 3 );
      MarketInfo(FP, MODE_BID);
       if ( GetLastError () > 0 )
        {
         Comment ( "Невозможно найти инструмент " , FP, " или " , StringSubstr (S, 0 , 3 )+ "USD. Необходимо добавить его в Обзоре рынка и перезапустить индикатор." );
         return ( 0 );
        } 
     } 
   // --------------------------------------  
     
   // "Создание" второй валютной пары кросса
   SP = "USD" + StringSubstr (S, 3 , 3 );
   MarketInfo(SP, MODE_BID);
   if ( GetLastError () > 0 )
     {
      SP = StringSubstr (S, 3 , 3 )+ "USD" ;
      MarketInfo(SP, MODE_BID);
       if ( GetLastError () > 0 )
        {
         Comment ( "Невозможно найти инструмент " , SP, " или " , StringSubstr (S, 3 , 3 )+ "USD. Необходимо добавить его в Обзоре рынка и перезапустить индикатор." );
         return ( 0 );
        } 
     } 
   // --------------------------------------  

   // Определение пути синтеза кросса
   if ( StringFind (FP, "USD" ) == 3 && StringFind (SP, "USD" ) == 0 )
     WayForCross = 1 ;
   if ( StringFind (FP, "USD" ) == 0 && StringFind (SP, "USD" ) == 0 )
     WayForCross = 2 ;
   if ( StringFind (FP, "USD" ) == 3 && StringFind (SP, "USD" ) == 3 )
     WayForCross = 3 ;
   if ( StringFind (FP, "USD" ) == 0 && StringFind (SP, "USD" ) == 3 )
     WayForCross = 4 ;
   // -------------------------------

   Tick = MarketInfo( Symbol (), MODE_TICKSIZE);
   
   Activate = True;  
//----
   return ( 0 );
  }
  
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   Comment ( "" );
   if ( ObjectFind ( "CrossBid" ) == 0 )
     ObjectDelete ( "CrossBid" );
   if ( ObjectFind ( "CrossAsk" ) == 0 )
     ObjectDelete ( "CrossAsk" );
   
//----
   return ( 0 );
  }
  
//+------------------------------------------------------------------+
//| Приведение значений к точности одного тика                       |
//+------------------------------------------------------------------+
double ND( double A)
{
 return ( NormalizeDouble (A, Digits ));
}  

//+------------------------------------------------------------------+
//| Расчет значения синтетического бида                              |
//+------------------------------------------------------------------+
double CalcBidWayForCross()
{
 switch (WayForCross)
   {
     case 1 : return (ND(MarketInfo(FP, MODE_BID)*MarketInfo(SP, MODE_BID)));
     case 2 : return (ND(MarketInfo(SP, MODE_BID)/MarketInfo(FP, MODE_ASK)));
     case 3 : return (ND(MarketInfo(FP, MODE_BID)/MarketInfo(SP, MODE_ASK)));
     case 4 : return ( 1 /(ND(MarketInfo(FP, MODE_ASK)*MarketInfo(SP, MODE_BID))));
   }
}

//+------------------------------------------------------------------+
//| Расчет значения синтетического аска                              |
//+------------------------------------------------------------------+
double CalcAskWayForCross()
{
 switch (WayForCross)
   {
     case 1 : return (ND(MarketInfo(FP, MODE_ASK)*MarketInfo(SP, MODE_ASK)));
     case 2 : return (ND(MarketInfo(SP, MODE_ASK)/MarketInfo(FP, MODE_BID)));
     case 3 : return (ND(MarketInfo(FP, MODE_ASK)/MarketInfo(SP, MODE_BID)));
     case 4 : return ( 1 /(ND(MarketInfo(FP, MODE_BID)*MarketInfo(SP, MODE_ASK))));
   }
}

  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int     counted_bars=IndicatorCounted();
//----
   if (!Activate)
     return ( 0 );

   // Расчет синтетических Bid и Ask
   double CalcBid = CalcBidWayForCross();  
   RefreshRates();
   double CalcAsk = CalcAskWayForCross();  
   double n, m;
   // -------------------------------

   // Рисуем уровень синтетического Bid
   if (ShowBid)
     {
       if ( ObjectFind ( "CrossBid" ) == - 1 )
        {
         ObjectCreate ( "CrossBid" , OBJ_HLINE , 0 , 0 , CalcBid); 
         ObjectSet( "CrossBid" , OBJPROP_COLOR , BidColor);
         ObjectSet( "CrossBid" , OBJPROP_STYLE , STYLE_DOT );
        } 
       else
         if (! ObjectMove ( "CrossBid" , 0 , 1 , CalcBid))
           Print ( "Ошибка перемещения №" , GetLastError ());
     }
   // ----------------------------------        

   // Рисуем уровень синтетического Ask
   if (ShowAsk)
    {
     if ( ObjectFind ( "CrossAsk" ) == - 1 )
       {
         ObjectCreate ( "CrossAsk" , OBJ_HLINE , 0 , 0 , CalcAsk); 
        ObjectSet( "CrossAsk" , OBJPROP_COLOR , AskColor);
        ObjectSet( "CrossAsk" , OBJPROP_STYLE , STYLE_DOT );
       } 
       else
       ObjectMove ( "CrossAsk" , 0 , 1 , CalcAsk);
    }
   // ----------------------------------        

   Comment ( "Реальный BID = " , DoubleToStr(Bid, Digits ), ", реальный ASK = " , DoubleToStr(Ask, Digits ), 
           "\nСинтетик BID = " , DoubleToStr(CalcBid, Digits ), ", синтетик ASK = " , DoubleToStr(CalcAsk, Digits ),
           "\nРазница BID Синтетика и Реального =" , n=(CalcBid-Bid),
           "\, Разница ASK Синтетика и Реального =" , m=(CalcAsk-Ask),
           "\nИтог =" (m - n)
           );

   // Выдаем звуковой сигнал о превышении минимальной разности
   if (ND( MathAbs (CalcBid-Bid)) >= ND(AlarmIfPointDifference* Point ))
     PlaySound (AlarmFile);
   // --------------------------------------------------------  
    
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
사유: