MetaEditor yapı 1490

 

Yeni işlev "FileSave", dosyayı yalnızca ikili biçimde mi kaydeder?

//+------------------------------------------------------------------+
//|                                                 Scripts_Test.mq5 |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
//--- входные параметры
input int       rates_to_save= 1000 ; // количество
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   string   filename= _Symbol + "_ticks.csv" ;
   MqlRates rates[];        
//---
   int copied= CopyRates ( Symbol (), Period (), 0 ,rates_to_save,rates);
   if (copied!=- 1 )
     {
       PrintFormat ( " CopyRates(%s) copied %d rates" , Symbol (),copied);
       //---  запишем тики в файл
       if (!FileSave(filename,rates, FILE_COMMON ))
         PrintFormat ( "FileSave() failed, error=%d" , GetLastError ());
     }
   else
       PrintFormat ( "Failed CopyRates(%s), Error=" , _Symbol , GetLastError ());
  }
//+------------------------------------------------------------------+

Yapmak istediğim şey: dosyayı "csv" formatında kaydetmek Excel'de açmak için.

Dosyalar:
 
Vladimir Karputov :

Yeni işlev "FileSave", dosyayı yalnızca ikili biçimde mi kaydeder?

Evet.
 

CGraphic.mqh sınıfı için öneri.

Bir grafik nesnesini silebilmek için GraphPlot yöntemlerini değiştirmeniz gerekir:

//+------------------------------------------------------------------+
//| Create graphic of one curve and return resource name             |
//+------------------------------------------------------------------+
string GraphPlot( const double &y[],ENUM_CURVE_TYPE type=CURVE_POINTS)
  {
   string    name= "Graphic" +( string )( GetTickCount ()+ MathRand ());
   ulong     width = ChartGetInteger ( 0 , CHART_WIDTH_IN_PIXELS );
   ulong     height= ChartGetInteger ( 0 , CHART_HEIGHT_IN_PIXELS );
   CGraphic graphic;
//--- create graphic and add curves
   graphic.Create( 0 ,name, 0 , 65 , 45 ,( int )( 0.6 *width),( int )( 0.65 *height));
   graphic.CurveAdd(y,type);
//--- plot curves
   graphic.CurvePlotAll();
   graphic.Update();
//--- return resource name
   //return graphic.ResourceName();
   return graphic.ChartObjectName();
  }

Örneğin, grafiğin artık "Graphic27489614" adlı bir nesnesi vardır, graph.ResourceName() yöntemi "::Graphic2748961427502758" değerini ve graph.ChartObjectName() yöntemi "Graphic27489614" değerini döndürür. Ve bir değişiklik yaparsanız , nesnenin adıyla ObjectDelete'i çağırabilir ve grafik nesnesini silebilirsiniz.

 
Vladimir Karputov :

CGraphic.mqh sınıfı için öneri.

Bir grafik nesnesini silebilmek için GraphPlot yöntemlerini değiştirmeniz gerekir:

Örneğin, grafiğin artık "Graphic27489614" adlı bir nesnesi vardır, graph.ResourceName() yöntemi "::Graphic2748961427502758" değerini ve graph.ChartObjectName() yöntemi "Graphic27489614" değerini döndürür. Ve bir değişiklik yaparsanız , nesnenin adıyla ObjectDelete'i çağırabilir ve grafik nesnesini silebilirsiniz.

Yani bu olasılık zaten var. Sadece CGraphic::ChartObjectName () yöntemini çağırarak silinecek nesnenin adını alırız.

PS Veya hatta CGraphic::Destroy () yöntemi.

 
Vladimir Karputov :

CGraphic.mqh sınıfı için öneri.

Bu ResourceSave için yapıldı.
 
Anatoli Kazharski :

Yani bu fırsat zaten var. Sadece CGraphic::ChartObjectName () yöntemini çağırarak silinecek nesnenin adını alırız.

PS Veya hatta CGraphic::Destroy () yöntemi.

Numara. Her iki yöntem de çalışmıyor (CGraphic::ChartObjectName() "NULL" döndürür), CGraphic::Destroy() bir grafiği silmek için hiç çalışmıyor.
 
Vladimir Karputov :
Numara. Her iki yöntem de çalışmaz (CGraphic::ChartObjectName() "NULL" döndürür), CGraphic::Destroy() bir grafiği silmek için hiç çalışmaz.

İkisi de benim için çalışıyor. Bu betiği test edin ve sürümünüzü gösterin. Neden senin için işe yaramadığını merak et.

Komut dosyasında iki yöntem test edilebilir.

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property version    "1.00"
//---
#include <Math/Stat/Binomial.mqh>
#include <Graphics/Graphic.mqh>
//--- Размер массива
#define ARRAY_SIZE 50
//---
double array_values[ARRAY_SIZE];
double array_results[ARRAY_SIZE];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ( void )
  {
   string name   = "Graphic" ;
   ulong   width  =:: ChartGetInteger ( 0 , CHART_WIDTH_IN_PIXELS );
   ulong   height =:: ChartGetInteger ( 0 , CHART_HEIGHT_IN_PIXELS );
//---
   CGraphic graphic;
//--- create graphic
   graphic.Create( 0 ,name, 0 , 65 , 45 ,( int )( 0.6 *width),( int )( 0.65 *height));
//---
   InitArray();
   CCurve *curve1=graphic.CurveAdd(array_values,CURVE_POINTS);
//---
   graphic.CurvePlotAll();
   graphic.Update();
//---
   for ( int i= 0 ; i< 10 ; i++)
     {
      InitArray();
      curve1.Update(array_values);
       //---
      graphic.CurvePlotAll();
      graphic.Update();
       //---
       Sleep ( 500 );
     }
//---
   graphic.Destroy();
//---
   :: Print ( __FUNCTION__ , " > graphic.ChartObjectName(): " ,graphic.ChartObjectName());
   if (!:: ObjectDelete ( 0 ,graphic.ChartObjectName()))
       Print ( __FUNCTION__ , " > Объект уже удалён!" );
  }
//+------------------------------------------------------------------+
//| Генерация значений                                               |
//+------------------------------------------------------------------+
void InitArray( void )
  {
   for ( int j= 0 ; j<ARRAY_SIZE; j++)
      array_values[j]=j;
   Shuffle(array_values);
  }
//+------------------------------------------------------------------+
//| Тасование значений массива                                       |
//+------------------------------------------------------------------+
void Shuffle( double &array[])
  {
   for ( uint i= 0 ; i<ARRAY_SIZE; i++)
      RandomSwap(array_values,i);
  }
//+------------------------------------------------------------------+
//| Случайно поменять элементы местами                               |
//+------------------------------------------------------------------+
void RandomSwap( double &array[], uint i)
  {
//--- Случайный индекс для замены
   uint j=:: rand ()%ARRAY_SIZE;
//--- Меняем местами
   double temp =array[i];
   array[i]    =array[j];
   array[j]    =temp;
  }
//+------------------------------------------------------------------+
 

Başlangıçta bu örneğe burada eziyet ettim ( MetaTrader 5 platform build 1485'in yeni versiyonundan alınmıştır: standart kütüphanede ek test modları ve çizelge )

//+------------------------------------------------------------------+
//|                                                       Test_1.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property version    "1.00"
#include <Math/Stat/Binomial.mqh>
#include <Graphics/Graphic.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ( void )
  {
   double     vars[ 101 ];
   double     results[ 101 ];
   const int N= 2000 ;
//---  
   MathSequence( 0 ,N, 20 ,vars);
   MathProbabilityDensityBinomial(vars,N, M_PI / 10 , true ,results);
   GraphPlot(results);
//---
  }
 
#include <Math\Stat\Math.mqh> // https://www.mql5.com/ru/forum/162251#comment_3885372
#include <Math\Stat\Normal.mqh>
#include <Graphics\Graphic.mqh>

void OnStart()
  {
//---
   double random_values[];
   double pdf[];
   double cdf[];
   double x[];
   if(MathRandomNormal(0,1,1000000,random_values))
     {
      if(MathProbabilityDensityEmpirical(random_values,200,x,pdf))
        {
         GraphPlot(x,pdf,CURVE_LINES);
         //---
         DebugBreak();
        }

      if(MathCumulativeDistributionEmpirical(random_values,200,x,cdf))
        {
         GraphPlot(x,cdf,CURVE_LINES);
         //---
         DebugBreak();
        }
     }
  }
 
Vladimir Karputov :

Başlangıçta bu örneğe burada eziyet ettim ( MetaTrader 5 platform build 1485'in yeni versiyonundan alınmıştır: standart kütüphanede ek test modları ve çizelge )

//+------------------------------------------------------------------+
//|                                                       Test_1.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property version    "1.00"
#include <Math/Stat/Binomial.mqh>
#include <Graphics/Graphic.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ( void )
  {
   double     vars[ 101 ];
   double     results[ 101 ];
   const int N= 2000 ;
//---  
   MathSequence( 0 ,N, 20 ,vars);
   MathProbabilityDensityBinomial(vars,N, M_PI / 10 , true ,results);
   GraphPlot(results);
//---
  }

Genel olarak, silerken şunu yaparım:

       ObjectsDeleteAll ( 0 , "Graphic" , 0 , OBJ_BITMAP_LABEL );
       ChartRedraw ();
 

SL/TP'nin OnTradeTransaction() içinde çalıştığını nasıl bilebilirim?

İşte yaptığım şey, yardımcı olmadı:

void    OnTradeTransaction ( const MqlTradeTransaction &trans,   // структура торговой транзакции
                           const MqlTradeRequest      &request, // структура запроса
                           const MqlTradeResult       &result)   // структура ответа
{
   if (trans.type == TRADE_TRANSACTION_HISTORY_ADD )
  {
     datetime date = TimeCurrent ();
     MqlDateTime dateT;
     TimeToStruct (date, dateT);
    dateT.hour += 1 ;
    date = StructToTime (dateT);
    
     if ( HistorySelect ( TimeCurrent (), date))
    {
       int dealsTotal = HistoryDealsTotal ();
       ulong ticketD = HistoryDealGetTicket (dealsTotal - 1 );
       if ( HistoryDealGetString (ticketD, DEAL_SYMBOL ) == Symbol ())
      {
         ENUM_DEAL_ENTRY entry = ( ENUM_DEAL_ENTRY ) HistoryDealGetInteger (ticketD, DEAL_ENTRY );
         if (entry == DEAL_ENTRY_OUT )
        {
           int ordersTotal = HistoryOrdersTotal ();
           ulong ticketO = HistoryOrderGetTicket (ordersTotal - 1 );
           if ( HistoryOrderGetString (ticketO, ORDER_SYMBOL ) == Symbol ())
          {
             double orderPrice = HistoryOrderGetDouble (ticketO, ORDER_PRICE_OPEN );
             double orderSL    = HistoryOrderGetDouble (ticketO, ORDER_SL );
             double orderTP    = HistoryOrderGetDouble (ticketO, ORDER_TP );
            
             if (orderPrice == orderSL)
               Print ( "Сработал SL" );
            
             if (orderPrice == orderTP)
               Print ( "Сработал TP" );
          }  
        }
      }  
    }
  }
}

Ve genel olarak, gerçekten herhangi bir şekilde daha kolay imkansız mı?!

2016.12.04 14:33:01.854 2016.11.17 03:14:40 kâr alma tetiklendi #4 sat 0.10 EURUSD 1.07103 sl: 1.07153 tp: 1.07053 [#5 1.07053'te 0.10 EURUSD satın al]
Peki, olay terminalin günlüklerinde görüntüleniyor, bu olayı (SL / TP tetikleme) danışmanda almak neden bu kadar kolay? Yoksa mümkün mü?