[ARCHIV!] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen - 4. - Seite 359

 
veti-k:

Nein, das ist zu viel. Was ist mehr volatil von mindestens 20-50 Pips
USDJPY
 

Leute, könnt ihr mir einen Rat geben:

Beim Testen des Advisors mit Standardindikatoren, die im MT4-Lieferumfang enthalten sind, auf Währungspaaren - keine Fragen - alles funktioniert gemäß dem Handelsalgorithmus.

Beim Testen von Metallen, wie z.B. Silber und Gold, werden die Orders nicht geöffnet, im Strategy Tester Journal schreiben sie Nullteilung.

Ich habe die gleichen Eingabeparameter, die Historie für diese fünfstellige Brokerfirma (forex4yu) wurde für die getesteten Instrumente hochgeladen.

Was ist der mögliche Grund? Ich möchte meinen EA nicht an einen Telepathen schicken. Ich habe den Expert Advisor persönlich nach der Version des Buches geschrieben.

 
Roman.:

Leute, könnt ihr mir einen Rat geben:

Beim Testen des Advisors mit Standardindikatoren, die in der MT4-Lieferung für Währungspaare enthalten sind, gab es keine Probleme - alles funktioniert gemäß dem Handelsalgorithmus.

Beim Testen von Metallen, wie z.B. Silber und Gold, werden die Orders nicht geöffnet, im Strategy Tester Journal schreiben sie Nullteilung.

Ich habe die gleichen Eingabeparameter, die Historie für diese fünfstellige Brokerfirma (forex4yu) wurde für die getesteten Instrumente hochgeladen.

Was ist der mögliche Grund? Ich möchte meinen EA nicht an einen Telepathen schicken. Ich habe den Expert Advisor persönlich nach der Version des Buches geschrieben.

Wenn Sie durch eine Variable dividieren, müssen Sie zunächst prüfen, ob sie ungleich Null ist.
 
Roman.:

Leute, könnt ihr mir einen Rat geben:

Beim Testen des Advisors mit Standardindikatoren, die in der MT4-Lieferung für Währungspaare enthalten sind, gab es keine Probleme - alles funktioniert gemäß dem Handelsalgorithmus.

Beim Testen von Metallen, wie z.B. Silber und Gold, werden die Orders nicht geöffnet, in der Log-Datei des Strategietesters werden sie durch Null geteilt.

Ich habe die gleichen Eingabeparameter, die Historie für diese fünfstellige Brokerfirma (forex4yu) ist für die getesteten Instrumente hochgeladen worden.

Was ist der mögliche Grund? Ich möchte meinen EA nicht an einen Telepathen schicken. Ich habe den Expert Advisor persönlich nach der Version des Buches geschrieben.


Sie sollten den Code sehen. Im Allgemeinen können Sie (in Notepad++) automatisch alle Stellen markieren, an denen ein Divisionszeichen im Code vorkommt, und sehen, ob die Division durch Null in irgendeinem Fall tatsächlich auftritt.
 
drknn:

Ich würde den Code gerne sehen. Und im Allgemeinen können Sie (in Notepad++) automatisch alle Stellen markieren, an denen das Divisionszeichen im Code vorkommt, und prüfen, ob in einem bestimmten Fall tatsächlich eine Division durch Null stattfindet.


Ja, ich sehe mir schon die Abdrücke an, wo das Auspacken angekommen ist, da ist alles in Ordnung...

In der Funktion der Volumennormalisierung für Metalle gab es diesen Fehler (Division durch Null), jetzt ist er nicht mehr vorhanden, es gab eine weitere 131 - falsches Volumen, obwohl offensichtlich = 0,01 Lot eingestellt, ich schaue allgemein...

Für Währungen funktioniert diese Funktion zur Normalisierung der Lautstärke korrekt.... Vielleicht gibt es eine Gemeinsamkeit zwischen ihnen (für Metalle und Währungen)?

//--------------------------------------------------------------------
// Lot_MM.mqh
// 
//--------------------------------------------------------------- 1 --
// Функция вычисления количества лотов.
// Глобальные переменные:
// double Lots_New - количество лотов для новых ордеров (вычисляется)
// double Lots     - желаемое количество лотов, заданное пользовател.
// double  MaksRisk  - процент риска
// Возвращаемые значения:
// true  - если средств хватает на минимальный лот
// false - если средств не хватает на минимальный лот
//--------------------------------------------------------------- 2 --
bool Lot_MM()                            // Позовательская ф-ия
  {
   int time, ticket;                  // Наибольшее время открытия и номер ордера
   double orderLots;                  // Lots   
   double orderProfit;                // Profit
   double Price;                      // Цена открытия рыночного ордера
   double SL;                         // Значение StopLoss ордера
   double  TP;                        // Значение TakeProfit ордера
   string Symb   =Symbol();                    // Финансовый инструм.
   double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Размер свободных средств, необходимых для открытия 1 лота
   double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер. лотов
   double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
   double Step   =MarketInfo(Symb,MODE_LOTSTEP);//Шаг изменен размера
   double Free   =AccountFreeMargin();         // Свободные средства
   double LotVal =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта для 1 лота
   

//--------------------------------------------------------------- 3 --
   if (Lots>0)                                 // Лоты заданы явно..
{                                              // ..проверим это
      double Money=Lots*One_Lot;               // Стоимость открываемого ордера   
      if(Money<=AccountFreeMargin())             // Средств хватает..     
         {  
          Lots_New=Lots;                           // ..принимаем заданное
            // else                                     // Если не хватает..
            // Lots_New=MathFloor(Free/One_Lot/Step)*Step;// Расчёт лотов 
            Print("Функция Lot_MM: Lots_New  = ", Lots_New);    
...
...
...
...
 // ---------НОРМАЛИЗУЕМ НОВЫЕ РАСЧЕТНЫЕ ЛОТЫ И ОТКРЫВАЕМ ОЧЕРЕДНУЮ ПОЗИЦИЮ...            
                    Lots_New = NormalizeLots(Lots_New);  
   return(true);                               // Выход из польз. ф-ии
  }
//--------------------------------------------------------------- 6 --

//+------------------------------------------------------------------+
//| Нормализация лота                                                |
//+------------------------------------------------------------------+

double NormalizeLots(double lot)
{
   double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   double lots = NormalizeDouble(lot / lotStep, 0) * lotStep;   
   lots = MathMax(lots, MarketInfo(Symbol(), MODE_MINLOT));
   lots = MathMin(lots, MarketInfo(Symbol(), MODE_MAXLOT));   
   return (lots);
}
 

Ich kann es nicht verstehen: die oberste Zeile wird gedruckt, aber die Order öffnet sich nicht mit Fehler 131 - falsches Volumen, ich habe bereits 0,1 und 0,01 eingestellt...

 Print ("Функция открытия ордера с рынка - продажа: Teeth = ",  NormalizeDouble(Teeth,Digits), " upfractal = ", upfractal," Цена Bid = ", NormalizeDouble(Bid,Digits), " Lots_New = ", NormalizeDouble(Lots_New,2));                
Ticket=OrderSend(Symbol(),1,0.01,Bid,50,0,0,"Antiunity-start",Magic,0,Red);    

 
Techno:
Wenn Sie durch eine Variable dividieren, müssen Sie zunächst prüfen, ob sie ungleich Null ist.

Danke, das werde ich in Zukunft im Hinterkopf behalten. Nur habe ich dieses Mal eine vorgefertigte Funktion zur Normalisierung der Lautstärke genommen.
 

Bis jetzt ohne Erfolg... Schreibt denselben Fehler...

 Print ("Функция открытия ордера с рынка - продажа: Teeth = ",  NormalizeDouble(Teeth,Digits), " upfractal = ", upfractal," Цена Bid = ", NormalizeDouble(Bid,Digits), " Lots_New = ", NormalizeDouble(Lots_New,2));                
          Ticket=OrderSend(Symbol(),1,Lots_New,Bid,50,0,0,"Antiunity-start",Magic,0,Red);            
          Print ("Функция открытия ордера с рынка - продажа: старт");      

Ich habe auf meinem Konto im Testprogramm eine Position für Gold mit 10.000 und 0,01 und 0,1 Lots eröffnet - ohne Erfolg.

Vielleicht hatte jemand ein ähnliches Problem? Können Sie mir einen Tipp geben...

 

Fügen Sie meine Losprüfungsfunktion in Ihre benutzerdefinierten Unterroutinen ein. Und rufen Sie es vor jedem OrderSend() auf. Das Runden erfolgt in meiner DLL nach den Gesetzen der Mathematik: Wenn die gerundete Zahl einen Bruchteil mit einer Zahl >=5 hat, dann wird aufgerundet. Wenn <=4, wird abgerundet. Soweit ich verstanden habe, haben Programmiersprachen aus irgendeinem Grund Probleme damit - ich musste meinen eigenen DLL-Code erstellen. Im Grunde ist der Code sehr einfach, aber ich habe zu meiner Zeit ziemlich viel im Internet gesucht, bevor ich die optimale Lösung gefunden habe. Benötigen Sie den Quellcode der DLL?

// ============ ProverkaLota() =====================================================================
// функция принимает нормализует лот ордера
//-----------------------------------------------------
double ProverkaLota(double LotOrdera,string SMB){
  double SMB_MinLot=MarketInfo(SMB,MODE_MINLOT);
  double SMB_MaxLot=MarketInfo(SMB,MODE_MAXLOT);
  double SMB_LotStep=MarketInfo(SMB,MODE_LOTSTEP);
  LotOrdera=OkruglenieDoSotykh(LotOrdera);// округляем до сотых

 if(SMB_LotStep==0.1){// округляем до десятых
   LotOrdera/=10;
   LotOrdera=OkruglenieDoSotykh(LotOrdera);
   LotOrdera*=10;// возвращаем дробную часть ордера на место
 }
 if(LotOrdera<SMB_MinLot){
   LotOrdera=SMB_MinLot;
 }
 if(LotOrdera>SMB_MaxLot){
   LotOrdera=SMB_MaxLot;
 }
 return(LotOrdera);
}
// =================================================================================================
Dateien:
basic_dll_1.zip  190 kb
 
drknn:

Fügen Sie meine Losprüfungsfunktion in Ihre benutzerdefinierten Unterroutinen ein. Und rufen Sie es vor jedem OrderSend() auf. Das Runden erfolgt in meiner DLL nach den Gesetzen der Mathematik: Wenn die gerundete Zahl in einem Bruchteil mit einer Zahl >=5 endet, dann wird aufgerundet. Wenn <=4, wird abgerundet. Soweit ich verstanden habe, haben Programmiersprachen aus irgendeinem Grund Probleme damit - ich musste meinen eigenen DLL-Code erstellen. Im Grunde ist der Code sehr einfach, aber ich habe zu meiner Zeit ziemlich viel im Internet gesucht, bevor ich die optimale Lösung gefunden habe. Benötigen Sie den Quellcode der DLL?


Ja, danke.