Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 246

 

Tünaydın. Belki birçokları için sorum inanılmaz derecede aptalca görünecek, üzgünüm, bu konuda hala bir çaydanlığım, sorunun ne olduğunu belirleyemiyorum.

MQL5\Files\date.txt klasöründe bir metin dosyası oluşturdum ve onu açamıyorum. 5004 hatası yazar. Zor değilse yardım edin.

 #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 :

Tünaydın. Belki birçokları için sorum inanılmaz derecede aptalca görünecek, üzgünüm, bu konuda hala bir çaydanlığım, sorunun ne olduğunu belirleyemiyorum.

MQL5\Files\date.txt klasöründe bir metin dosyası oluşturdum ve onu açamıyorum. 5004 hatası yazar. Zor değilse yardım edin.

Dosyanız MT5 istemci terminallerinin paylaşılan klasöründe değilse (ve sizin durumunuzda öyle),

daha sonra FILE_COMMON bayrağı kaldırılmalıdır:

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

Dosyanız MT5 istemci terminallerinin paylaşılan klasöründe değilse (ve sizin durumunuzda öyle),

daha sonra FILE_COMMON bayrağı kaldırılmalıdır:

Yardımın için teşekkürler ama maalesef işe yaramadı. Bayraklarla birçok seçenek denedim. Ayrıca 5004 hatası yazıyor. Denemek için başka bir şey olabilir mi?
 
olegin038 :
Yardımın için teşekkürler ama maalesef işe yaramadı. Bayraklarla birçok seçenek denedim. Ayrıca 5004 hatası yazıyor. Denemek için başka bir şey olabilir mi?

Sadece metin olarak açmayı deneyin:

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

Sadece metin olarak açmayı deneyin:

O da işe yaramadı. Daha önce dosyalarla hiç çalışmadım. Buraya ekstra bir şey yazmaya gerek var mı?
 
olegin038 :
O da işe yaramadı. Daha önce dosyalarla hiç çalışmadım. Buraya ekstra bir şey yazmaya gerek var mı?

Evet, dosyayı kapatmalısınız:

 void OnTick ()
  {
   ResetLastError ();
   int Handle= FileOpen ( "date.txt" , FILE_CSV | FILE_READ | FILE_WRITE , ';' );
   if (Handle==- 1 )   
     { 
     Print ( "Файл не открыт, ошибка: " , GetLastError ());     
     }
   FileClose (Handle);
   return ;
  }
 
Çok teşekkürler! Gerçekten yardımcı oldu. Artık hata vermiyor.
 
Kişisel Kütüphaneden seçkin yazarların derslerini paylaşacağım.
Erin, Bazhenov, Strmzh, Lukyanov, Cheryomushkin, Gerchik, Alex Million, vb.
Bu yazarların hemen hemen tüm dersleri.
Sormak.

 
Abramboss :
Kişisel Kütüphaneden seçkin yazarların derslerini paylaşacağım.
Erin, Bazhenov, Strmzh, Lukyanov, Cheryomushkin, Gerchik, Alex Million, vb.
Bu yazarların hemen hemen tüm dersleri.
Sormak.

Ücretsiz paylaş? Gerchik'le ilgileniyor.
 

Merhaba! İyi bilinen CrossArbitr göstergesiyle ilgili yardıma ihtiyacınız var. Kod elbette benim değil. Çıkmadığı bazı bilgilere ihtiyacı vardı. Yani sırayla.

Eklenen değişkenler double n, m;

"\nSentetik ve Gerçek arasındaki BID farkı =", n=(CalcBid-Bid),

"\, Sentetik ve Gerçek ASK Farkı =", m=(CalcAsk-Ask),

"\nToplam =" (m - n) <----

Sonuç olarak, bu parantezdeki eksiye yemin ediyor (bazı operatörler bekleniyor). Kim bana neyi yanlış yaptığımı söyleyebilir?

 //+------------------------------------------------------------------+
//|                                                  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 );
  }
//+------------------------------------------------------------------+