[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 270

 
hoz:


Beh, non volevo dire chefi_Ticket non è necessario, ma perché gli è stato assegnato il valore predefinito di 0 (zero). Io lo farei così:

Duplicherò di nuovo il codice sorgente:

Questa funzione permette di ottenere informazioni di trading da uno strumento (senza vincolarsi a un ordine, per esempio, prima di aprire un ordine) e lo stesso, ma in combinazione con un ordine specifico (quando è seguito da un ordine). Il valore predefinito è usato per facilitare l'uso della funzione. Il valore negativo di fi_Ticket è usato quando si inizializza la libreria commerciale.

P.S. E prima, fate attenzione ai nomi delle variabili, e più precisamente ai loro prefissi. Le variabili che hanno una b iniziale, come bs_Symbol, sono dichiarate globalmente dalla libreria. La maggior parte delle variabili globali sono dichiarate in b-PSI@Base.

 

Si prega di guardare il codice EA, non riesco a capire quale sia la ragione.... Al primo avvio può aprire un trade immediatamente, ma dopo la chiusura smette di funzionare fino al prossimo riavvio del terminale o on/off permette all'EA di commerciare... Funziona con l'indicatore Gann 2.0

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:
Ecco un esempio dalla documentazione di un comando che vi aiuterà - capite come funziona, cambiate i parametri:

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


GRAZIE
 
chief2000:
Ecco un esempio dalla documentazione di un comando che vi aiuterà - capite come funziona, cambiate i parametri:

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


Scusate il ritardo nella risposta, ho avuto problemi con il mio computer.
 
chief2000:
Ecco un esempio dalla documentazione di un comando che vi aiuterà - capite come funziona, cambiate i parametri:

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


Scusate il ritardo nella risposta, ho avuto problemi con il mio computer.
 
al7bar:

Si prega di guardare il codice EA, non riesco a capire quale sia la ragione.... Al primo avvio può aprire un trade immediatamente, ma dopo la chiusura smette di funzionare fino al prossimo riavvio del terminale o on/off permette all'EA di commerciare... Funziona con l'indicatore Gann 2.0

Non si vedono errori logici evidenti. Si prega di stampare il codice passo dopo passo. La procedura di trading è legata al valore della variabile ticket. Prima di tutto, monitorare i suoi cambiamenti. Fate anche attenzione al valore della variabile globale "TRADECONTEXT" - il suo valore deve essere 0.
 
TarasBY:

Questa funzione permette di ottenere informazioni di trading per uno strumento (senza collegarlo a un ordine, per esempio, prima di aprire un ordine) e lo stesso, ma in combinazione con un ordine specifico (quando lo accompagna). Il valore predefinito è usato per facilitare l'uso della funzione. Il valore negativo di fi_Ticket è usato quando si inizializza la libreria commerciale.

P.S. E prima, fate attenzione ai nomi delle variabili, o più precisamente ai loro prefissi. Le variabili che hanno una b iniziale, come bs_Symbol, sono dichiarate globalmente dalla libreria. La maggior parte delle variabili globali sono dichiarate in b-PSI@Base.


Igor, lo capisco. Ma il punto è che, come ho capito, per ottenere informazioni di mercato per un dato simbolo, non abbiamo bisogno di collegarlo a un ordine. Se c'è uno strumento, un ordine non è necessario... Non è affatto necessario. Dopo tutto, hai solo bisogno del nome dello strumento per ottenere informazioni di mercato. Non siete d'accordo?

Questa variabile di cui chiedevobs_Symbol è menzionata per la prima volta nell'inclusione di b-PSY@Base.mqh, ecco la stringa:

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

Ma non gli viene assegnato nulla. Allora:

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

C'è un'espressione:

fs_Symbol != bs_Symbol

Dovrebbe essere inteso come:fs_Symbol != 0 giusto?

TarasBY:

P.S. E prima, fate attenzione ai nomi delle variabili, o più precisamente ai loro prefissi. Le variabili che hanno una b iniziale, come bs_Symbol, sono dichiarate globalmente dalla libreria. La maggior parte delle variabili globali sono dichiarate in b-PSI@Base.


Di solito uso g_ per indicare le variabili globali (dalla parola global), voi usate l(ad esempio li_cnt) per indicare le variabili locali?
 

Amici, ho bisogno di aiuto per mettere a punto un EA.

C'è del codice che apre un ordine sotto certe condizioni if. L'esecuzione della condizione può avvenire ad ogni tick perché è posta nel corpo di int start().

Abbiamo bisogno di:

1. Dopo l'esecuzione di una condizione (e l'apertura di un ordine), dovremmo fare una pausa per l'apertura di nuovi ordini, pausa per n barre. Per esempio, se il mio Expert Advisor è su timeframe M30 e ho bisogno di passare 3 ore, allora la pausa dovrebbe essere di 6 barre.

2. Il programma dovrebbe funzionare nel tester di strategia.

Quale codice è necessario? E dove sarebbe il posto giusto per inserirlo.

int start()
  { 
   ...

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

   ...
  }
 
hoz:


Igor, lo capisco. Ma il punto è che, come ho capito, per ottenere informazioni di mercato su un dato strumento, non è affatto necessario collegarlo a un ordine. Se c'è uno strumento, un ordine non è necessario... Non è affatto necessario. Dopo tutto, hai solo bisogno del nome dello strumento per ottenere informazioni di mercato. Non siete d'accordo?

Questa variabile di cui chiedevobs_Symbol è menzionata per la prima volta nell'inclusione di b-PSY@Base.mqh, ecco la stringa:

Ma non gli viene assegnato nulla. Allora:

C'è un'espressione:

Dovrebbe essere inteso come:fs_Symbol != 0 giusto?


Di solito uso g_ per indicare le variabili globali (dalla parola global) e l(ad esempio li_cnt) per indicare quelle locali?

Hai ancora molto da imparare. Finora le vostre ipotesi non sono corrette. Le mie funzioni possono servire diversi scopi allo stesso tempo (per ridurre il codice stesso), in particolare fGet_MarketInfo(). Tutto è stato pensato ripetutamente e nulla deve essere cambiato!

Iniziate, per esempio, con un esperimento: dichiarate una variabile globale nel corpo dell'EA e provate a chiamare questa variabile dalla libreria collegata. Provate a collegare i risultati a nomi di variabili che hanno un prefisso che inizia con b, per esempio bs_Symbol.

P.S. Non ho bisogno di essere controllato: o usate le mie biblioteche, o non le usate. Se qualcosa (una parte della mia libreria) non funziona correttamente - fatemelo sapere e lo correggerò. E fare domande - "Perché funziona così? - avete bisogno di più conoscenza, perché "l'ovvietà non è in superficie".

 
TarasBY:

Hai ancora molto da imparare. Finora le vostre ipotesi non sono vere. Le mie funzioni possono servire diversi scopi allo stesso tempo (per ridurre il codice stesso), in particolare fGet_MarketInfo(). Tutto è stato pensato ripetutamente e nulla deve essere cambiato!

Capisco quello che c'è. Ma non è chiaro perché sia implementato in questo modo.

TarasBY:

Per esempio, iniziate con un esperimento: dichiarate una variabile globale nel corpo dell'EA e provate a chiamare questa variabile dalla libreria collegata. Provate a collegare i risultati a nomi di variabili che hanno un prefisso che inizia con b, per esempio bs_Symbol.

Non potrete comunque utilizzare le vostre librerie nella loro forma originale, cioè tutto è legato lì. Ogni funzione su un pacchetto di altre...

TarasBY:

P.S. Non ho bisogno di essere controllato: o usate le mie biblioteche, o non le usate. Se qualcosa (qualche mia libreria) non funziona correttamente - fatemelo sapere e lo sistemerò. E fare domande - "Perché funziona così? - avete bisogno di più conoscenza, perché "l'ovvietà non sta in superficie".

Non volevo metterlo alla prova in nessun modo... In effetti, non c'è dubbio che sia scritto in modo molto competente. È solo che non capisco bene tutto, per questo ho detto che non credo... Guardo, penso... Ma non capisco tutto. Ecco perché ho chiesto.

P.S. Con bs_Symbol continuo a non capire.

Motivazione: