MetaEditor Build 1490

 

Die neue Funktion "FileSave" speichert eine Datei nur in binärer Form?

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

Was ich tun wollte: die Datei im "csv"-Format speichern, um sie in Excel zu öffnen.

Dateien:
 
Vladimir Karputov:

Die neue Funktion "FileSave" speichert die Datei nur in binärer Form?

Ja.
 

Vorschlag für die Klasse CGraphic.mqh.

Um ein Diagrammobjekt löschen zu können, müssen die GraphPlot-Methoden geändert werden:

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

Zum Beispiel gibt es jetzt ein Objekt mit dem Namen "Graphic27489614" im Diagramm, die Methode graphic.ResourceName() gibt "::Graphic2748961427502758" zurück und die Methode graphic.ChartObjectName() gibt "Graphic27489614" zurück. Und wenn Sie eine Änderung vornehmen, können Sie ObjectDelete mit dem Objektnamen aufrufen und das Diagrammobjekt löschen.

 
Vladimir Karputov:

Vorschlag für die Klasse CGraphic.mqh.

Um ein Diagrammobjekt löschen zu können, müssen die GraphPlot-Methoden geändert werden:

Zum Beispiel gibt es jetzt ein Objekt mit dem Namen "Graphic27489614" im Diagramm, die Methode graphic.ResourceName() gibt "::Graphic2748961427502758" zurück und die Methode graphic.ChartObjectName() gibt "Graphic27489614" zurück. Und wenn Sie eine Änderung vornehmen, können Sie ObjectDelete mit dem Objektnamen aufrufen und das Diagrammobjekt löschen.

Aber diese Möglichkeit besteht bereits. Durch den Aufruf der MethodeCGraphic::ChartObjectName() erhalten wir den Namen des zu löschenden Objekts.

P.S. Oder auchCGraphic::Destroy() Methode.

 
Vladimir Karputov:

Vorschlag für die Klasse CGraphic.mqh.

Dies wurde für ResourceSave getan.
 
Anatoli Kazharski:

Diese Funktion ist bereits verfügbar. Durch einen einfachen Aufruf der MethodeCGraphic::ChartObjectName() erhalten wir den Namen des zu löschenden Objekts.

P.S. Oder auchCGraphic::Destroy() Methode.

Nein. Beide Methoden funktionieren nicht (CGraphic::ChartObjectName() gibt "NULL" zurück), CGraphic::Destroy() ist überhaupt nicht für das Zerstören von Diagrammen gedacht.
 
Vladimir Karputov:
Nein. Beide Methoden funktionieren nicht (CGraphic::ChartObjectName() gibt "NULL" zurück), CGraphic::Destroy() ist überhaupt nicht zum Löschen von Diagrammen geeignet.

Für mich funktioniert beides. Testen Sie dieses Skript und zeigen Sie mir Ihre Version. Ich frage mich, warum es bei Ihnen nicht funktioniert hat.

Sie können zwei Methoden in dem Skript testen.

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

Ursprünglich habe ich dieses Beispiel gefoltert (ausMetaTrader 5 Build 1485: zusätzliche Test- und Chart-Modi in der Standardbibliothek)

//+------------------------------------------------------------------+
//|                                                       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:

Ursprünglich habe ich dieses Beispiel gefoltert (ausMetaTrader 5 Build 1485: zusätzliche Test- und Charting-Modi in der Standardbibliothek)

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

In der Zeit des allgemeinen Umzugs tue ich dies:

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

Wie kann ich wissen, ob SL/TP in OnTradeTransaction() ausgelöst wird?

Ich habe Folgendes getan, aber es hat nicht geholfen:

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");
          }  
        }
      }  
    }
  }
}

Und überhaupt, einfacher geht's doch gar nicht!

2016.12.04 14:33:01.854 2016.11.17 03:14:40 take profit triggered #4 sell 0.10 EURUSD 1.07103 sl: 1.07153 tp: 1.07053 [#5 buy 0.10 EURUSD at 1.07053]
Hier wird das Ereignis in den Terminal-Logs angezeigt, warum ist es so einfach, dieses Ereignis (SL/TP Triggerung) im EA zu erhalten? Oder ist das möglich?