[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 4. - pagina 413

 
Neo777:

Ecco un EA per fare in modo che l'ordine si apra sulla CHIUSURA della candela, non solo su una croce.

Vorrei sapere come aprire l'ordine.


E come pensate di sapere che la barra si chiuderà con questo tick? Forse con l'apertura di un nuovo bar?

Il codice è inserito dal pulsante SRC

 

OK.

Sì, il nuovo bar.

 
Neo777:

OK.

Sì, il nuovo bar.

https://www.mql5.com/ru/articles/1494 qui ci sono modi per determinare se una nuova barra è iniziata. Come è iniziato - controlla le tue condizioni
 

Buon pomeriggio, qualcuno mi aiuti con la funzione WindowScreenShot. Per il 3° giorno nessuno risponde((. Ho scritto il seguente script (vedi file allegato).

In 2 parole sulla sceneggiatura. Lo script è destinato a fare screenshot del grafico corrente della finestra del terminale client. Nella variabile esterna extern datetime Time_bar viene specificato il tempo della barra da cui e fino alla barra zero verrà creata (tenendo conto del rientro destro sul grafico). Nella linea

int bar_number=iBarShift(NULL,0,Time_bar,true)

si cerca il numero di serie della barra che abbiamo specificato nella variabile esterna extern datetime time_bar. La funzione stessa, nella linea

bool f=WindowScreenShot(name+".gif",1024,768,bar_number,Scale,View_graph)

Ora ecco la domanda... Per semplicità, supponiamo di dover creare uno screenshot delle ultime due barre. Poi, se la linea

int bar_number=iBarShift(NULL,0,Time_bar,true)

è lasciato invariato, il risultato sarà la seguente schermata


Cioè, non c'è nessuna barra nello screenshot (anche se la stringa

int bar_number=iBarShift(NULL,0,bar_time,true)

si dovrebbe calcolare il numero di barre in base al tempo)

Se questa linea è presentata nel modo seguente

int bar_number=iBarShift(NULL,0,Time_bar,true)+2

otterrete lo screenshot che volevamo:

Domanda: perché nel caso in cui questa stringa ha la seguente forma

int bar_number=iBarShift(NULL,0,Time_bar,true)

lo screenshot è preso con uno spostamento di 2 barre a destra di quello specificato nella riga precedente?

P.S. Per non sporcare il forum, grazie in anticipo per la risposta

File:
 
ilunga:
mostra il codice + quali parametri di input sono nell'indicatore

L'ho controllato 20 volte, non scriverei senza controllarlo 20 volte, tutti i parametri sono corretti come nell'indicatore. Il problema potrebbe essere altrove, forse avete incontrato un problema simile?
 

Colleghi!!! Buona sera!

Ho scoperto un incredibile indicatore QQE e ho deciso di trovare un Expert Advisor basato su questo indicatore.... e non sono riuscito a trovarlo. Tuttavia, su questo forum ho trovato un messaggio dell'utente POZITIV.

Ha scritto la seguente logica: "quando la linea rossa attraversa la linea gialla verso l'alto, si dovrebbe aprire un ordine di acquisto, quando la linea rossa attraversa la linea gialla verso l'alto - un ordine di vendita".

Come risultato, aveva un codice mezzo finito dell'Expert Advisor.

Ho calcolato un'altra logica per me: quando la curva in grassetto attraversa la linea tratteggiata dall'alto verso il basso - si deve vendere e chiudere quel lotto (comprare), quando quella rossa in grassetto attraversa la linea tratteggiata dal basso verso l'alto. E nello stesso momento aprire immediatamente un altro lotto (comprare), che dovrebbe chiudersi (vendere) quando accade la situazione opposta.....-anche aprire costantemente un lotto, e ogni incrocio delle linee serve per chiuderne uno e contemporaneamente aprirne un altro. E l'intersezione probabilmente dovrebbe essere considerato dai loro valori dopo la chiusura di una barra, cioè se il 20 minuti (dopo la chiusura), grassetto aveva un valore di 51 (condizionale), e il punteggiato 50, e 21 minuti (dopo la chiusura), grassetto 50 e il punteggiato 51, allora devi vendere. Nessun SL o TC.

In linea di principio la logica è semplice. Niente frecce, niente allarmi e messaggi. Commercia solo in modalità automatica nella sua forma pura.

Per favore, aiutatemi a perfezionare questo codice (sotto) con questa logica. E sarebbe possibile regolare il periodo (da 1 minuto a 1 giorno) e il parametro SF (smoothing).

Per il secondo giorno ho cercato di capire il codice e correggerlo, ma non sono un programmatore(((((((((((


Spero davvero nel vostro aiuto!

//--- input parameters
extern double MaxRisk=1.0;
extern double FixLot = 0.01;
extern double Exponent=2.0;
extern int Magic=888;

// костыли

extern int TakeProfit=100;
extern int StopLoss=100;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
//----

//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
//----
   int Count=0;
   double b0,b1;
   int ticket;

// параметры индикатора
   int SF=5; // original 5
   int RSI_Period=14; // original 14
   double DARFACTOR=4.236; //original 4.236

//------------ Параметры из индикатора QQEA -----------------------
// Buffer0 -- красная жирная
   string Buffer0=iCustom(NULL,0,"QQEA",SF,RSI_Period,DARFACTOR,0,0);
// Buffer1 -- жёлтый пунктир
   string Buffer1=iCustom(NULL,0,"QQEA",SF,RSI_Period,DARFACTOR,1,0);

   b0=StrToDouble(Buffer0);
   b1=StrToDouble(Buffer1);


   double Lot=GetLot(MaxRisk);
// если лот <0 выводим сообщение об ошибке
   if(Lot==0)
     {
      Alert("Недостаточно средств!");
      return(0);
     }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if(Lot!=0 && b0>b1) // если лот <> 0 и красная выше жёлтой
     {
      ticket=NewOrder(OP_BUY,Lot);
      if(ExistOrders(Symbol(),1,888,0)==true) // проверяем наличие ордера sell
        {
         CloseOrder();
        }
     }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if(Lot!=0 && b0<b1) // если лот <> 0 и красная выше жёлтой
     {
      ticket=NewOrder(OP_SELL,Lot);
      if(ExistOrders(Symbol(),0,888,0)==true) // проверяем наличие ордера buy
        {
         CloseOrder();
        }
     }

   Comment("Red line: ",b0,"Yellow line: ",b1);
   return(0);
  }
//-------------------------------------------------------------
//расчёт лота

double GetLot(int Risk)
  {
   double Free=AccountFreeMargin();
   double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
   double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
   double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
   double Step=MarketInfo(Symbol(),MODE_LOTSTEP);
   double Lot =MathFloor(Free*Risk/100/One_Lot/Step)*Step;
   if(Lot<Min_Lot) Lot=Min_Lot;
   if(Lot>Max_Lot) Lot=Max_Lot;
   if(Lot*One_Lot>Free) return(0.0);
   return(Lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool ExistOrders(string sy="",int op=-1,int Magic=-1,datetime ot=0)
  {
   int i,k=OrdersTotal(),ty;

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++)
      //+------------------------------------------------------------------+
      //|                                                                  |
      //+------------------------------------------------------------------+
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         ty=OrderType();
         if(ty>1 && ty<6)
           {
            if((OrderSymbol()==sy || sy=="") && (op<0 || ty==op))
              {
               if(Magic<0 || OrderMagicNumber()==Magic)
                 {
                  if(ot<=OrderOpenTime()) return(True);
                 }
              }
           }
        }
     }
   return(False);
  }
//открытие нового ордера
int NewOrder(int Cmd,double Lot)
  {
   double TP=0; //тейкпрофит
   double SL=0; //стоплосс
   double PR=0; //Цена
   while(!IsTradeAllowed()) Sleep(100);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if(Cmd==OP_BUY)
     {
      PR=Ask;
      if(TakeProfit>0) TP=Ask+TakeProfit*Point;
      if(StopLoss>0) SL=Ask-StopLoss*Point;
     }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if(Cmd==OP_SELL)
     {
      PR=Bid;
      if(TakeProfit>0) TP=Bid-TakeProfit*Point;
      if(StopLoss>0) SL=Bid+StopLoss*Point;
     }
   if(GetOrdersCount(Magic,Cmd)>0)return(0);
   int tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP," ",0,0,Green);
   if(tic<0) Print("Ошибка открытия ордера: ",GetLastError());
   return(tic);
  }
// закрытие ордера
void CloseOrder()
  {
   double PR=0;
   while(!IsTradeAllowed()) Sleep(100);
   if(OrderType()==OP_BUY) PR=Bid;
   if(OrderType()==OP_SELL) PR=Ask;
   if(!OrderClose(OrderTicket(),OrderLots(),PR,3,Red))
      Print("Ошибка закрытия ордера: ",GetLastError());
   return;
  }
//+------------------------------------------------------------------+
// подсчет кол-ва открытых позиций
int GetOrdersCount(int MagicNumber,int Type)
  {
   int count=0;

   for(int i=0; i<OrdersTotal(); i++)
     {
      // already closed
      if(OrderSelect(i,SELECT_BY_POS)==false) continue;
      // not current symbol
      if(OrderSymbol()!=Symbol()) continue;
      // order was opened in another way
      if(OrderMagicNumber()!=MagicNumber) continue;

      if(OrderType()==Type)
        {
         count++;
        }
     }

   return(count);
  }
//-------------------------------------------------------
 
sss2019:

Bene, ho controllato tutto 20 volte io stesso, senza controllare 20 volte non scriverei, tutti i parametri sono corretti come nell'indicatore. Il problema probabilmente si trova altrove, forse qualcuno ha incontrato un problema simile?
Nient'altro che parametri sbagliati inseriti in iCustom e non può essere. Cercatelo.
Ho passato una serata a cercare di risolverlo da solo. Ho confuso la sequenza dei parametri quando ho trasferito l'esterno da un indicatore a un EA. Ero quasi pazzo, la sequenza dei parametri era la stessa :))
 
granit77:
Nient'altro che l'inserimento di parametri errati in iCustom e non può essere. Cercatelo.
Io stesso ho passato una serata a litigare l'altro giorno. Ho confuso la sequenza dei parametri quando ho trasferito i parametri esterni dall'indicatore all'Expert Advisor. Ero quasi pazzo, la sequenza dei parametri era la stessa :))

iCustom(Symbol(),0,"RMRCS_entry-point"," ",5,6,7,62,-62,57,-57,54,-54,0.7,1.1,1.07," ",1,9,6,1,34,6,0,4,89,1,3,3.0,2.0,0.5,3.0," ",6,6,70,30,0.0,6,3.0," ",1,21,1,45,89,1,35,89,1,9," ",4,2,5,1," ",49,-49,0,0,0,0,0,0,0,0," ",0,34,200,150,1,100," ",1,3,1,1,2," ",1.4,3.7,0,1);


Ed ecco i parametri

extern string REI_str = "";
extern int REI1_Per=5; 
extern int REI2_Per=6;     
extern int REI3_Per=7;     
extern int REI1_up=62;    
extern int REI1_dn=-62;    
extern int REI2_up=57;     
extern int REI2_dn=-57;            
extern int REI3_up=54;     
extern int REI3_dn=-54;            
extern double REI1_ct=0.7;  
extern double REI2_ct=1.1;  
extern double REI3_ct=1.07;
extern string MACD_str = "";
extern int MACD_FastMA_Meth=1;   
extern int MACD_FastMA_Per=9;    
extern int MACD_FastMA_Price=6; 
extern int MACD_SlowMA_Meth=1;   
extern int MACD_SlowMA_Per=34; 
extern int MACD_SlowMA_Price=6; 
extern int MACD_SL_Meth=0;      
extern int MACD_SL_Per=4;       
extern int MACD_Diap_Per=89;    
extern int MACD_Slope_Meth=1;   
extern int MACD_Slope_Per=3;  
extern double MACD_ct_1 = 3.0; 
extern double MACD_ct_2 = 2.0;  
extern double MACD_ct_3 = 0.5;  
extern double MACD_ct_4 = 3.0;  
extern string RSI_str = "";
extern int RSI_Per = 6;     
extern int RSI_Price = 6;  
extern int RSI_up = 70;      
extern int RSI_dn = 30;     
extern double RSI_ct1 = 0.0; 
extern int RSI_ct2 = 6;      
extern double RSI_ct3 = 3.0;
extern string CHO_str = "";
extern int  CHO_FastMA_Meth=1;      
extern int  CHO_FastMA_Per=21;      
extern int  CHO_SlowMA_Meth=1;      
extern int  CHO_SlowMA_Per=45;      
extern int  CHO_DiapVal_Per=89;     
extern int  CHO_MADiapVal_Meth=1;   
extern int  CHO_MADiapVal_Per=35;    
extern int  CHO_SlopeDiapVal_Per=89;  
extern int  CHO_MASlope_Meth=1;      
extern int  CHO_MASlope_Per=9;       
extern string Stoch_str = "";
extern int Stoch_KPer=4;       
extern int Stoch_DPer=2;        
extern int Stoch_Slow=5;        
extern int Stoch_SL_MA_Meth=1; 
extern string EntryLevel_str = "";
extern int REI_SvS_up = 49;  
extern int REI_SvS_dn = -49; 
extern int MACD_SvS_up = 0; 
extern int MACD_SvS_dn = 0;  
extern int RSI_SvS_up = 0;  
extern int RSI_SvS_dn = 0; 
extern int CHO_SvS_up = 0;  
extern int CHO_SvS_dn = 0;  
extern int STO_SvS_up = 0; 
extern int STO_SvS_dn = 0;  
extern string EntryOther_str = "";
extern int MALgthBar_Meth=0;
extern int MALgthBar_Per=34;
extern int MAXLgthBar = 200;
extern int TtS_MinABS = 150; 
extern int Shift_Points = 1; 
extern int Start_Calc = 100;   
extern string EntryCondition = "";
extern bool Ban_InvEntry = true;    
extern int InvEntry_Bars = 3;        
extern bool Ban_TtS_Decline=true;   
extern bool Ban_Entry_Series = true; 
extern int MAX_Entry_Series=2;      
extern string Gen_str = ""; 
extern double DiapBar_CtSl = 1.4;
extern double TakeProf_CtSl = 3.7;
 
sss2019:
Potete dirmi se c'è un limite al numero di parametri in un indicatore non standard, quando è collegato tramite iCustom?

Ho c'è un indicatore con circa 8 parametri Ho inserito tutti i parametri correttamente, ho controllato più volte, ma l'errore ')' appare ancora alla compilazione - conteggio parametri errato D:\InstaTrader\expert_2.mq4 (11, 280)

Direi "circa 80".
 

Togliete l'extern da alcuni dei parametri che sono poco usati e non ci sarà confusione.

Attenzione alle mie domande:

Perché gli oggetti appaiono sotto i candelabri, qual è la ragione di questo?

Potete ricordarmi come fare una casella di controllo per il prezzo, qual è la proprietà dell'oggetto.

Motivazione: