Yeni işlev "FileSave", dosyayı yalnızca ikili biçimde mi kaydeder?
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.
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.
CGraphic.mqh sınıfı için öneri.
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ış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\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();
}
}
}
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:
ChartRedraw ();
SL/TP'nin OnTradeTransaction() içinde çalıştığını nasıl bilebilirim?
İşte yaptığım şey, yardımcı olmadı:
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ı?!
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
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.