MetaEditor build 1490
La nueva función "FileSave" sólo guarda el archivo en forma binaria?
Sugerencia para la clase CGraphic.mqh.
Para poder eliminar un objeto gráfico, es necesario cambiar los métodos de GraphPlot:
//| 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();
}
Por ejemplo, ahora mismo hay un objeto llamado "Graphic27489614" en el gráfico, el método graphic.ResourceName() devuelve "::Graphic2748961427502758" y el método graphic.ChartObjectName() devuelve "Graphic27489614". Y si hace un cambio, puede llamar a ObjectDelete con el nombre del objeto y eliminar el objeto del gráfico.
Sugerencia para la clase CGraphic.mqh.
Para poder eliminar un objeto gráfico, es necesario cambiar los métodos de GraphPlot:
Por ejemplo, ahora mismo hay un objeto llamado "Graphic27489614" en el gráfico, el método graphic.ResourceName() devuelve "::Graphic2748961427502758" y el método graphic.ChartObjectName() devuelve "Graphic27489614". Y si hace un cambio, puede llamar a ObjectDelete con el nombre del objeto y eliminar el objeto del gráfico.
Pero esta posibilidad ya existe. Llamando al métodoCGraphic::ChartObjectName(), obtenemos el nombre del objeto a eliminar.
P.D. O incluso el métodoCGraphic::Destroy().
Propuesta para la clase CGraphic.mqh.
Esta función ya está disponible. Simplemente llamando al métodoCGraphic::ChartObjectName(), obtenemos el nombre del objeto a eliminar.
P.D. O incluso el métodoCGraphic::Destroy().
No. Ambos métodos no funcionan (CGraphic::ChartObjectName() devuelve "NULL"), CGraphic::Destroy() no sirve para borrar el gráfico en absoluto.
Las dos cosas me funcionan. Pruebe este script y muéstreme su versión. Me pregunto por qué no te ha funcionado.
Puedes probar dos métodos en el script.
//| 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;
}
//+------------------------------------------------------------------+
Originalmente torturé este ejemplo (tomado deMetaTrader 5 build 1485: modos de prueba y gráficos adicionales en la biblioteca estándar)
//| 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();
}
}
}
Originalmente torturé este ejemplo (tomado deMetaTrader 5 build 1485: modos de prueba y gráficos adicionales en la biblioteca estándar)
//| 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);
//---
}
En la eliminación general por el momento estoy haciendo esto:
ChartRedraw();
¿Cómo puedo saber si el SL/TP se activa en OnTradeTransaction()?
Esto es lo que he hecho, no ayuda:
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");
}
}
}
}
}
}
Y de todos modos, ¡no puede haber una forma más sencilla!
La nueva función "FileSave" sólo guarda un archivo en forma binaria?
//| 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());
}
//+------------------------------------------------------------------+
Lo que quería hacer: guardar el archivo en formato "csv" para abrirlo en Excel.