Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 732

 
Fox_RM:

Hallo zusammen!

Bitte beraten Sie, was ist das Problem mit iCustom Wertübertragung in EA.

2014.10.12 10:23:06.656 TestGenerator: Nicht übereinstimmende Datenfehler (Volumengrenze 470 am 2014.03.14 21:45 überschritten)

2014.10.12 10:23:53.468 2014.03.06 18:15 ClusterExp2 GBPUSD,M15: 2147483647 2147483647

Correl8-Indikator auf einer Büroklammer.

Vielen Dank im Voraus!

Laden Sie den Verlauf für das zu testende Symbol hoch. Fehler in den Verlaufsdaten, nicht in iCustom()
 
artmedia70:
Laden Sie den Verlauf für den zu testenden Charakter hoch. Der Fehler liegt in den Verlaufsdaten, nicht in iCustom()
Ich danke Ihnen!!!
 
borilunad:
Guten Morgen, Artyom! Ja, das mit den Magiern ist klar! Aber wenn etwas nicht in einer Schleife, sondern in Bedingungen wie if-else ist, reicht es aus, nur die erste Bedingung if(Symbol()==mySymbol) (natürlich ohne else) zu stellen, vorher präsentiert mySymbol=Symbol()?! Damit alle Variablen aller EAs gleich sind, aber jeder in seinem eigenen Graphen! Ich kann es noch nicht überprüfen, ich bin noch am Schreiben, am "Ausarbeiten"! :)
Wenn string mySymbol=Symbol();, dann wird diese Variable den Wert des aktuellen Symbols enthalten. Dementsprechend wird für jeden EA, der auf seinem eigenen Chart handelt, der Wert dieser Variablen gleich dem Wert des Symbols sein, auf dem der EA gestartet wurde.
 
artmedia70:
Wenn string mySymbol=Symbol();, dann wird diese Variable den Wert des aktuellen Symbols enthalten. Dementsprechend ist der Wert dieser Variable für jeden EA, der auf seinem eigenen Chart handelt, gleich dem Wert des Symbols, auf dem der EA gestartet wurde.
Irgendwie habe ich nicht an die Schnur gedacht! Ich habe immer noch mit Fehlern in getesteten Funktionen zu kämpfen, die in anderen EAs gut funktionieren!Vielen Dank!
 

Drucken in eine Datei. Ich lerne mit dieser Datei zu drucken.

Warum werden Nullen in cl_time gedruckt?

1,37243 1,37253 -1 07:27:13 00:00:00
1,37248 1,37256 -1 07:57:21 00:00:00
1,37256 1,37256 -1 08:17:30 00:00:00
1,37266 1,37268 -1 08:48:11 00:00:00
1,37267 1,37293 -1 08:53:15 00:00:00
1,37269 1,37307 1 09:17:57 00:00:00
1,37275 1,3727 1 10:23:02 00:00:00
1,37269 1,37269 1 10:28:03 00:00:00
1,37268 1,37231 1 10:33:10 00:00:00
1,37278 1,37255 1 10:57:38 00:00:00
1,37256 1,37269 -1 11:02:42 00:00:00
1,37268 1,37284 1 11:07:45 00:00:00
1,37283 1,37307 -1 11:12:49 00:00:00
1,37314 1,37335 1 12:11:37 00:00:00
1,37317 1,37323 1 12:23:12 00:00:00
1,37324 1,37326 1 12:28:20 00:00:00
1,37396 1,37415 1 13:26:32 00:00:00
1,37413 1,37419 1 13:37:20 00:00:00
1,3744 1,37578 1 13:56:29 00:00:00

//+------------------------------------------------------------------+
//|                                                    cci on ma.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+

#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "https://www.mql4.com"
#property strict

input double Lots                   =0.1;

input int Expiration           =5; //laikas minutemis

//---- input parameters
input int cci_p                     = 89;
input int ma                        = 13;
input int NumberOfBarsToCalculate   = 100;

input string   comment=".csv  or  .txt";//коментарий
input string   FileType="csv";//тип файла 

datetime op_time=0,cl_time=0;
double  op_price=0,cl_price=0;
int op_type=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick(void)
  {
   
   int    cnt,ticket,total;

   

//---
   if(Bars<cci_p+1)
     {
      Print("bars less than ",cci_p);
      return;
     }

//--- to simplify the coding and speed up access data are put into internal variables
   double cci_dn=iCustom(NULL,0,"cci_ma",cci_p,ma,NumberOfBarsToCalculate,2,0);
   double cci_up=iCustom(NULL,0,"cci_ma",cci_p,ma,NumberOfBarsToCalculate,3,0);
   

   total=OrdersTotal();
   if(total<1)
     {
      //--- check for long position (BUY) possibility
      if(cci_up>0 && cci_up!=EMPTY_VALUE)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"cci sample",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               
               op_time=TimeLocal();
               op_price=Close[0];
               op_type=1;
               Print("BUY order opened : ",OrderOpenPrice());
               Print("op_price : ",op_price, "op_time : ",op_time);
           }
         else
            Print("Error opening BUY order : ",GetLastError());
         return;
        }
      //--- check for short position (SELL) possibility
      if(cci_dn<0 && cci_dn!=EMPTY_VALUE)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"cci sample",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               
               op_time=TimeLocal();
               op_price=Close[0];
               op_type=-1;
               Print("BUY order opened : ",OrderOpenPrice());
               Print("op_price : ",op_price, "op_time : ",op_time);
           }
         else
            Print("Error opening SELL order : ",GetLastError());
        }
      //--- exit from the "no opened orders" block
      return;
     }
//--- it is important to enter the market correctly, but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
     {
      if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         continue;
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         //--- long position is opened
         if(OrderType()==OP_BUY)
           {
            //--- should it be closed?
            if(TimeCurrent()>=op_time+Expiration*60)
              {
               //--- close order and exit
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
               
               cl_time=TimeCurrent();//op_time+Expiration*60;
               cl_price=Close[0];               
               
               Print("OrderClose error ",GetLastError());               
               
              PrintToFile(op_price, cl_price, op_type, op_time, cl_time);
      
               return;
              }  
           }
         else // go to short position
           {
            //--- should it be closed?
            if(TimeCurrent()>=op_time+Expiration*60)
              {
               //--- close order and exit
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
               cl_time=TimeCurrent();//op_time+Expiration*60;
               cl_price=Close[0];              
               
               Print("OrderClose error ",GetLastError());               
               
               PrintToFile(op_price, cl_price, op_type, op_time, cl_time);
                  
               return;
              }         
           }
        }
     }
//---
  }
//+------------------------------------------------------------------+
void PrintToFile(double opPrice=0,double clPrice=0,int opType=0, datetime opTime=0, datetime clTime=0)
{
   string fileName=StringConcatenate(Symbol()," ",Period()," ","gi_EA_cci");
   
   int handle;
   handle=FileOpen(fileName+FileType, FILE_WRITE|FILE_READ,";");
               if(handle!=INVALID_HANDLE)
               {
                  PrintFormat("Файл %s открыт для записи",fileName);
                  PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
                  //--- сначала запишем количество сигналов
                  FileSeek(handle, 0, SEEK_END);
                  FileWrite(handle,
                           opPrice,
                           clPrice,
                           opType,                           
                           TimeToString(opTime,TIME_MINUTES|TIME_SECONDS), 
                           TimeToString(clTime,TIME_MINUTES|TIME_SECONDS));
      
      
                  //--- закрываем файл
                  FileClose(handle);
                  PrintFormat("Данные записаны, файл %s закрыт",fileName);
               }
               else
               PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",fileName,GetLastError());
}
 
Können Sie mir sagen, wie ich eine Rücknahme auf dem Brett erkennen kann?
 
beginner:
Können Sie mir sagen, wie man eine Rücknahme auf dem Brett definiert?

Bei einigen "Bestellungen" ergibt OrderType() einen Wert, der numerisch gleich 6 ist. Dies sind die Abhebungen und Einzahlungen.

Nach einem erfolgreichen OrderSelect()-Aufruf (mit Rückgabe von true) können Sie die Größe der Abhebung/Nachladung durch den von OrderProfit() zurückgegebenen Wert und durch das Vorzeichen dieses Wertes bestimmen - ob es sich um eine Abhebung oder eine Einzahlung handelt...

Außerdem erheben einige Broker eine Gebühr, die eine Abhebung um den Betrag der Gebühr vortäuscht. Sie können versuchen, die Erhebung von Provisionen von der Abhebung vom Konto durch einen Kommentar zu unterscheiden, den Sie mit OrderComment() erhalten.

Seien Sie jedoch vorsichtig: Dies alles ist nicht dokumentiert und kann jederzeit aufhören zu funktionieren.

 
simpleton:


Ich danke Ihnen!
 
Liebe Programmierer! Bei der Optimierung eines Expert Advisors versuche ich persönlich, wie viele andere Teilnehmer auch, das maximale Verhältnis von Gewinn zu maximalem Drawdown (Verhältnis: Gewinn/Verlust) zu finden, was meiner Meinung nach der wichtigste Indikator ist. Ich führe diese Prozedur manuell durch, nachdem der Lauf des Testers abgeschlossen ist. Ist es möglich, diesen Prozess zu automatisieren? Oder wie bestimmt jeder von Ihnen diesen Parameter? Ich danke Ihnen im Voraus.
 
yosuf:
Liebe Programmierer! Bei der Optimierung eines Expert Advisors versuche ich persönlich, wie viele andere Teilnehmer auch, das maximale Verhältnis von Gewinn zu maximalem Drawdown (Verhältnis: Gewinn/Verlust) zu finden, was meiner Meinung nach der wichtigste Indikator ist. Ich führe diese Prozedur manuell durch, nachdem der Lauf des Testers abgeschlossen ist. Ist es möglich, diesen Prozess zu automatisieren? Oder wie bestimmt jeder von Ihnen diesen Parameter? Ich danke Ihnen im Voraus.

Ich tue dies

//+---------------------- OnTester() --------------------------------+
double OnTester()
{
double Result     = 0;
double Profit     = TesterStatistics(STAT_PROFIT);
double Drowdown   = TesterStatistics(STAT_EQUITY_DD);

if(Drowdown>0)
Result = Profit/Drowdown;
else Result = 0;

   return(NormalizeDouble(Result,2));
}
//+------------------------------------------------------------------+

Grund der Beschwerde: