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

 
hoz:


Ich meinte nicht, dass der Parameterfi_Ticket nicht benötigt wird, sondern warum er standardmäßig auf 0 (Null) gesetzt wurde. Ich würde es einfach so machen:

Ich werde den Quellcode noch einmal duplizieren:

Diese Funktion ermöglicht es, Handelsinformationen über ein Instrument zu erhalten (ohne Bindung an einen Auftrag, z.B. vor der Eröffnung eines Auftrags) und dasselbe, aber in Verbindung mit einem bestimmten Auftrag (wenn ein Auftrag folgt). Der Standardwert wird verwendet, um die Verwendung der Funktion zu erleichtern. Der negative Wert von fi_Ticket wird bei der Initialisierung der Handelsbibliothek verwendet.

P.S. Achten Sie zunächst auf die Variablennamen, genauer gesagt auf ihre Präfixe. Variablen, die ein anfängliches b haben, wie bs_Symbol, werden global von der Bibliothek deklariert. Die meisten globalen Variablen werden in b-PSI@Base deklariert.

 

Bitte sehen Sie sich den EA-Code an, ich kann nicht herausfinden, woran das liegt.... Beim ersten Start kann es Trades sofort öffnen, aber nach dem Schließen funktioniert es nicht mehr, bis zum nächsten Terminal-Neustart oder ein/aus erlauben EA zu handeln... Arbeitet mit dem Gann 2.0 Indikator

extern string     s0                = "Setup: Main";
extern int        Magic             = 1121;
extern double     lots              = 0.1;
extern int        StopLoss          = 70;
extern int        TakeProfit        = 140;
extern bool       UseTrail          = true;
extern bool       TrailWhileMinus   = false;
extern int        Trail             = 70;

extern string     s1                = "Setup: GANN indicator";
extern bool UseBeginDate = false;
extern string BeginDate = "2010.01.01 00:00";
extern int nBarsBack = 120;//250;
extern string prices = "0=close, 4=median, 5=typical";
extern int Price_Mode = 5;
extern bool Show_GridMatrix = false;
extern bool Show_GannGrid = false;
extern bool Show_HiloArrows = true;
extern bool Show_PriceArrows = true;
extern bool Show_Comments = false;
extern string ____MainGrid____ = "ooo";
extern color MainGrid_Color = Silver;//Green;//Sienna;
extern int MainGrid_Style = STYLE_DOT;
extern int MinMaxGrid_Style = STYLE_SOLID;
extern int MainGrid_Width = 1;
extern int fontSize = 8;
extern bool Draw_AllGrids = false;
extern bool Draw_AdditionalGrids = false;
extern string ____GannGrid____ = "ttt";
extern color GannGrid_Color = Silver;//Gray;
extern int GannGrid_Style = STYLE_DOT;
extern int GannGrid_Width = 177;
extern string ____Default_GridParameters____ = "Recomanded GridInterval 35 or 36";
extern int MainGrid_Intervals = 3677;   //default=35(!)
extern double GannGrid_Interval = 8.0;//with default 8.5 is the time interval not OK; and 9 is too large
extern int Text_Shift = 50;

//s1, UseBeginDate, BeginDate, nBarsBack, prices, Price_Mode, Show_GridMatrix, Show_GannGrid, Show_HiloArrows, Show_PriceArrows, Show_Comments, ____MainGrid____, MainGrid_Style, MinMaxGrid_Style, MainGrid_Width, fontSize, Draw_AllGrids, Draw_AdditionalGrids, ____GannGrid____, GannGrid_Style, GannGrid_Width, ____Default_GridParameters____, MainGrid_Intervals, GannGrid_Interval, Text_Shift

int               slip              = 3;

int Ticket[1000];

void deinit() 
{
   SemaphoreDeinit("TRADECONTEXT");

   return(0);
}


int start()
{
   static datetime TimeFlag = 0;
   datetime        TimeLast = Time[0];
   if(TimeFlag < TimeLast)
   {
      TimeFlag = TimeLast;
      
      int GANN = GetSignal_GANN();
      
      AnalyzeSignals(GANN);
      
      if(UseTrail == true) TrailAllOrders();
   }
   return(0);
}



void AnalyzeSignals(int GANN)
{
   static int ticket = 0;
   int sig = -1;
   bool res;
   
   ticket = RefreshTicket(ticket);
   
   if(GANN == OP_BUY)
      sig = OP_BUY;
   else if(GANN == OP_SELL)
      sig = OP_SELL;   

   if(ticket != 0)
   {
      OrderSelect(ticket, SELECT_BY_TICKET);      
      int type = OrderType();
      
      if(sig == OP_BUY && type == OP_SELL)
      {
         SemaphoreTake("TRADECONTEXT"); 
         res = OrderClose(ticket, OrderLots(), Ask, slip);
         SemaphoreReturn("TRADECONTEXT");
         if(!res) {Alert("OrderClose Error: ", GetLastError());}
         else ticket = 0;
      }
   
      else if(sig == OP_SELL && type == OP_BUY)
      {
         SemaphoreTake("TRADECONTEXT"); 
         res = OrderClose(ticket, OrderLots(), Bid, slip);
         SemaphoreReturn("TRADECONTEXT");
         if(!res) {Alert("OrderClose Error: ", GetLastError());}
         else ticket = 0;
      } 
   }   
   
   
   if(ticket == 0)
   {   
      double _lot = lots;
   
      if(sig == OP_BUY)
      {
         SemaphoreTake("TRADECONTEXT"); 
         ticket = OrderSend(Symbol(), OP_BUY, _lot, Ask, slip, Bid - StopLoss*Point, Bid + TakeProfit*Point, NULL, Magic);
         SemaphoreReturn("TRADECONTEXT");
         if(ticket < 0) {Alert("OrderSend Error: ", GetLastError());}
      }
   
      else if(sig == OP_SELL)
      {
         SemaphoreTake("TRADECONTEXT");
         ticket = OrderSend(Symbol(), OP_SELL, _lot, Bid, slip, Ask + StopLoss*Point, Ask - TakeProfit*Point, NULL, Magic);
         SemaphoreReturn("TRADECONTEXT");
         if(ticket < 0) {Alert("OrderSend Error: ", GetLastError());}
      }
   }
}

int RefreshTicket(int ticket)
{
   bool res;
   
   if(ticket <= 0)
      return(0);
   else
   {
      res = OrderSelect(ticket, SELECT_BY_TICKET);
      if(!res)
         return(0);
      else if(OrderCloseTime() != 0)
         return(0);
   }
   
   return(ticket);      //all ok, ticket still valid
}

int GetSignal_GANN()
{
   //Alert("!!: ", s1, ";", UseBeginDate, ";", BeginDate, ";", nBarsBack, ";", prices, ";", Price_Mode, ";", Show_GridMatrix, ";", Show_GannGrid, ";", Show_HiloArrows, ";", Show_PriceArrows, ";", Show_Comments, ";", ____MainGrid____, ";", MainGrid_Color, ";", MainGrid_Style, ";", MinMaxGrid_Style, ";", MainGrid_Width, ";", fontSize, ";", Draw_AllGrids, ";", Draw_AdditionalGrids, ";", ____GannGrid____, ";", GannGrid_Color, ";", GannGrid_Style, ";", GannGrid_Width, ";", ____Default_GridParameters____, ";", MainGrid_Intervals, ";", GannGrid_Interval, ";", Text_Shift);

   double ga_up = iCustom(NULL, 0, "Gann v2.0", s1, UseBeginDate, BeginDate, nBarsBack, prices, Price_Mode, Show_GridMatrix, Show_GannGrid, Show_HiloArrows, Show_PriceArrows, Show_Comments, ____MainGrid____, MainGrid_Color, MainGrid_Style, MinMaxGrid_Style, MainGrid_Width, fontSize, Draw_AllGrids, Draw_AdditionalGrids, ____GannGrid____, GannGrid_Color, GannGrid_Style, GannGrid_Width, ____Default_GridParameters____, MainGrid_Intervals, GannGrid_Interval, Text_Shift, 
                                          4, 0);
  
   double ga_dn = iCustom(NULL, 0, "Gann v2.0", s1, UseBeginDate, BeginDate, nBarsBack, prices, Price_Mode, Show_GridMatrix, Show_GannGrid, Show_HiloArrows, Show_PriceArrows, Show_Comments, ____MainGrid____, MainGrid_Color, MainGrid_Style, MinMaxGrid_Style, MainGrid_Width, fontSize, Draw_AllGrids, Draw_AdditionalGrids, ____GannGrid____, GannGrid_Color, GannGrid_Style, GannGrid_Width, ____Default_GridParameters____, MainGrid_Intervals, GannGrid_Interval, Text_Shift, 
                                          6, 0); 

   Print("ga_up = ", ga_up);
   Print("ga_dn = ", ga_dn);
   
   if(ga_up > 0.0)
      return(OP_BUY);
   else if(ga_dn > 0.0)
      return(OP_SELL);
   else
      return(-1);   
}


int TrailAllOrders()
{
   int i, total;
   
   total = CreateTicketArray(OP_BUY, Magic);
   for(i=0; i<total; i++)
      TrailingStop(Ticket[i]);

   total = CreateTicketArray(OP_SELL, Magic);
   for(i=0; i<total; i++)
      TrailingStop(Ticket[i]);
}

void TrailingStop(int ticket)
{
   int res;
   OrderSelect(ticket, SELECT_BY_TICKET);
   
   if(OrderType() == OP_BUY)
      if(TrailWhileMinus == true || Bid-OrderOpenPrice()>Point*Trail)         //не тралим, пока не можем достичь безубытка первым переносом стопа   
         if(Bid - OrderStopLoss() > Trail*Point)
         {
            SemaphoreTake("TRADECONTEXT");
            res = OrderModify(OrderTicket(), 0, Bid - Trail*Point, OrderTakeProfit(), 0);
            SemaphoreReturn("TRADECONTEXT"); 
            if(res<0)
               Alert("TrailingStop OrderModify Error: ", GetLastError());
        }
         
   if(OrderType() == OP_SELL)
      if(TrailWhileMinus == true || OrderOpenPrice()-Ask>Point*Trail)         //не тралим, пока не можем достичь безубытка первым переносом стопа
         if(OrderStopLoss() - Ask > Trail*Point)
         {
            SemaphoreTake("TRADECONTEXT");
            res = OrderModify(OrderTicket(), 0, Ask + Trail*Point, OrderTakeProfit(), 0);
            SemaphoreReturn("TRADECONTEXT");        
            if(res<0)
               Alert("TrailingStop OrderModify Error: ", GetLastError());
         }
}

int CreateTicketArray(int dir, int SysID)
{
   int total=OrdersTotal(), i, c=0; if (total<=0) return (0);
        for(i=0;i<total;i++) { OrderSelect(i, SELECT_BY_POS); if ((OrderType()==dir) && (OrderMagicNumber()==SysID)) { Ticket[c] = OrderTicket(); c++; } }
        return (c);
}

//------------------------------------------SEMAPHORE------------------------------------------

int critical = 0; 

void SemaphoreTake(string SEM)
{ 
   if(GlobalVariableCheck(SEM) == false)
      GlobalVariableSet(SEM, 0);
  
   while(1==1)
   {
      if(GlobalVariableSetOnCondition(SEM, 1.0, 0.0))         //получили доступ
      {
         critical = 1;
         Print("SEMAPHORE \"", SEM, "\" TAKEN. CURRENT VALUE: ", GlobalVariableGet(SEM));
         break;      //выходим из цикла ожидания доступа
      }
      else
      {
         Print("ATTEMPT TO CAPTURE SEMAPHORE \"", SEM, "\" FAILED. SEMAPHORE BUSY. WAITING 0.1 SEC. CURRENT VALUE: ", GlobalVariableGet(SEM));
         Sleep(100);
      }
   }
} 

void SemaphoreReturn(string SEM)
{
   GlobalVariableSet(SEM, 0.0);
   Print("SEMAPHORE \"", SEM, "\" RETURNED. CURRENT VALUE: ", GlobalVariableGet(SEM));
   critical = 0;
}

void SemaphoreDeinit(string SEM)    //Вставить в ф-ю  deinit()
{
   if(critical == 1)
   {
      GlobalVariableSet(SEM,      0.0);    //на случай, если советника убивают, пока он в процессе посылки запроса
   }  
}
 
chief2000:
Hier ist ein Beispiel aus der Dokumentation für einen Befehl, der Ihnen helfen wird - finden Sie heraus, wie er funktioniert, ändern Sie die Parameter:

High[iHighest(NULL,0,MODE_HIGH,20,4)];
Low[iLowest(NULL,0,MODE_LOW,10,10)];


DANKESCHÖN
 
chief2000:
Hier ist ein Beispiel aus der Dokumentation für einen Befehl, der Ihnen helfen wird - finden Sie heraus, wie er funktioniert, ändern Sie die Parameter:

High[iHighest(NULL,0,MODE_HIGH,20,4)];
Low[iLowest(NULL,0,MODE_LOW,10,10)];


Entschuldigen Sie die Verspätung meiner Antwort, ich hatte Probleme mit meinem Computer.
 
chief2000:
Hier ist ein Beispiel aus der Dokumentation für einen Befehl, der Ihnen helfen wird - finden Sie heraus, wie er funktioniert, ändern Sie die Parameter:

High[iHighest(NULL,0,MODE_HIGH,20,4)];
Low[iLowest(NULL,0,MODE_LOW,10,10)];


Entschuldigen Sie die Verspätung meiner Antwort, ich hatte Probleme mit meinem Computer.
 
al7bar:

Bitte sehen Sie sich den EA-Code an, ich kann nicht herausfinden, woran das liegt.... Beim ersten Start kann es Trades sofort öffnen, aber nach dem Schließen funktioniert es nicht mehr, bis zum nächsten Terminal-Neustart oder ein/aus erlauben EA zu handeln... Arbeitet mit dem Gann 2.0 Indikator

Es wurden keine offensichtlichen Logikfehler festgestellt. Bitte drucken Sie den Code Schritt für Schritt aus. Das Handelsverfahren ist an den Wert der Ticketvariablen gebunden. Verfolgen Sie zunächst seine Veränderungen. Achten Sie auch auf den Wert der globalen Variable "TRADECONTEXT" - ihr Wert muss 0 sein.
 
TarasBY:

Mit dieser Funktion können Sie Handelsinformationen für ein Instrument abrufen (ohne Verknüpfung mit einem Auftrag, z. B. vor der Eröffnung eines Auftrags) und dasselbe in Verbindung mit einem bestimmten Auftrag (wenn Sie ihn begleiten). Der Standardwert wird verwendet, um die Verwendung der Funktion zu erleichtern. Der negative Wert von fi_Ticket wird bei der Initialisierung der Handelsbibliothek verwendet.

P.S. Achten Sie zunächst auf die Variablennamen, genauer gesagt auf ihre Präfixe. Variablen, die ein anfängliches b haben, wie bs_Symbol, werden global von der Bibliothek deklariert. Die meisten globalen Variablen werden in b-PSI@Base deklariert.


Igor, ich verstehe das. Aber der Punkt ist, so wie ich es verstehe, um Marktinformationen über ein bestimmtes Symbol zu erhalten, müssen wir es überhaupt nicht mit einem Auftrag verknüpfen. Wenn es ein Instrument gibt, ist eine Bestellung nicht erforderlich... Überhaupt nicht notwendig. Schließlich benötigen Sie nur den Namen des Instruments, um Marktinformationen zu erhalten. Meinen Sie nicht auch?

Die Variable, nach der ich gefragt habe,bs_Symbol, wird zum ersten Mal in der Aufnahme von b-PSY@Base.mqh erwähnt , hier ist die Zeichenfolge:

  bs_Symbol,                            // текущий инструмент

Aber es wird nichts zugewiesen. Dann:

if (fs_Symbol != bs_Symbol || fi_Ticket < 0)

Es gibt ein Sprichwort:

fs_Symbol != bs_Symbol

Sollte verstanden werden als:fs_Symbol != 0 richtig?

TarasBY:

P.S. Achten Sie zunächst auf die Namen der Variablen, genauer gesagt, auf ihre Präfixe. Variablen, die ein anfängliches b haben, wie bs_Symbol, werden global von der Bibliothek deklariert. Die meisten globalen Variablen werden in b-PSI@Base deklariert.


Hm. Ich verwende normalerweise g_, um globale Variablen zu bezeichnen (vom Wort global). Verwenden Sie l(z. B. li_cnt), um lokale Variablen zu bezeichnen?
 

Freunde, ich brauche Hilfe bei der Feinabstimmung eines EA.

Es gibt einen Code, der eine Bestellung unter einer bestimmten Wenn-Bedingung öffnet. Die Ausführung der Bedingung kann bei jedem Tick erfolgen, da sie im Body von int start() platziert ist.

Wir brauchen:

1. Nach der Ausführung einer Bedingung (und der Eröffnung eines Auftrags), sollten wir eine Pause für die Eröffnung neuer Aufträge, Pause für n Bars. Wenn sich mein Expert Advisor beispielsweise auf dem Zeitrahmen M30 befindet und ich 3 Stunden verstreichen lassen muss, sollte die Pause 6 Balken betragen.

2. Das Programm sollte im Strategietester funktionieren.

Welcher Code wird benötigt? Und wo wäre die richtige Stelle, um sie einzufügen.

int start()
  { 
   ...

   if (...)                                                          //условие
      {
       OrderSend(Symbol(),OP_BUY,lot,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
       ...
      }

   ...
  }
 
hoz:


Igor, ich verstehe das. Der Punkt ist jedoch, dass man, wenn man Marktinformationen über ein bestimmtes Instrument erhalten will, dieses gar nicht mit einem Auftrag verknüpfen muss. Wenn es ein Instrument gibt, ist eine Bestellung nicht erforderlich... Überhaupt nicht notwendig. Schließlich benötigen Sie nur den Namen des Instruments, um Marktinformationen zu erhalten. Meinen Sie nicht auch?

Die Variable, nach der ich gefragt habe,bs_Symbol, wird zum ersten Mal in der Aufnahme von b-PSY@Base.mqh erwähnt , hier ist die Zeichenfolge:

Aber es wird nichts zugewiesen. Dann:

Es gibt ein Sprichwort:

Sollte verstanden werden als:fs_Symbol != 0 richtig?


Hm. Normalerweise verwende ich g_ für globale Variablen (vom Wort global) und l(z. B. li_cnt) für lokale?

Sie haben noch viel zu lernen. Bislang sind Ihre Annahmen nicht zutreffend. Meine Funktionen können gleichzeitig verschiedenen Zwecken dienen (um den Code selbst zu reduzieren), insbesondere fGet_MarketInfo(). Alles ist mehrfach durchdacht und nichts muss geändert werden!

Beginnen Sie z. B. mit einem Experiment: Deklarieren Sie eine globale Variable im EA-Körper und versuchen Sie, diese Variable aus der verlinkten Bibliothek aufzurufen. Versuchen Sie, die Ergebnisse mit Variablennamen zu verknüpfen, deren Präfix mit b beginnt, zum Beispiel bs_Symbol.

P.S. Ich muss nicht überprüft werden: Entweder Sie benutzen meine Bibliotheken oder nicht. Wenn etwas (ein Teil meiner Bibliothek) nicht richtig funktioniert, lassen Sie es mich wissen und ich werde es korrigieren. Und Fragen zu stellen - "Warum funktioniert das so? - Sie brauchen mehr Wissen, denn "die Offensichtlichkeit liegt nicht an der Oberfläche".

 
TarasBY:

Sie haben noch viel zu lernen. Bislang sind Ihre Annahmen nicht zutreffend. Meine Funktionen können gleichzeitig verschiedenen Zwecken dienen (um den Code selbst zu reduzieren), insbesondere fGet_MarketInfo(). Alles ist mehrfach durchdacht und nichts muss geändert werden!

Ich verstehe, was dort steht. Aber es ist nicht klar, warum es auf diese Weise umgesetzt wird.

TarasBY:

Beginnen Sie zum Beispiel mit einem Experiment: Deklarieren Sie eine globale Variable im EA-Körper und versuchen Sie, diese Variable aus der verknüpften Bibliothek aufzurufen. Versuchen Sie, die Ergebnisse mit Variablennamen zu verknüpfen, deren Präfix mit b beginnt, zum Beispiel bs_Symbol.

Sie können Ihre Bibliotheken ohnehin nicht mehr in ihrer ursprünglichen Form verwenden, d.h. alles ist dort gebunden. Jede Funktion auf einer Packung von anderen...

TarasBY:

P.S. Ich muss nicht überprüft werden: Entweder Sie benutzen meine Bibliotheken oder nicht. Wenn etwas (eine meiner Bibliotheken) nicht richtig funktioniert, lassen Sie es mich wissen und ich werde es korrigieren. Und Fragen zu stellen - "Warum funktioniert das so? - Sie brauchen mehr Wissen, denn "die Offensichtlichkeit liegt nicht an der Oberfläche".

Ich wollte es nicht in irgendeiner Weise testen... In der Tat besteht kein Zweifel daran, dass es sehr kompetent geschrieben ist. Es ist nur so, dass ich nicht alles verstehe, deshalb habe ich gesagt, dass ich das nicht glaube... Ich schaue, ich denke... Aber ich verstehe nicht alles. Deshalb habe ich gefragt.

P.S. Bei bs_Symbol verstehe ich es immer noch nicht.

Grund der Beschwerde: