[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 180

 
solnce600:

Buona giornata a tutti voi!

Sono un novellino. È la prima volta che provo a mettere un'idea in codice nel tester.

L'idea è semplice - aprire un ordine al prezzo di apertura di ogni candela oraria, alternativamente in alto e in basso.

Ho scritto un semplice codice .... Ma il problema è che il programma a volte apre più di 1 ordine all'apertura di una candela.

Mi sembra che succeda quando più di 1 tick arriva entro 1 secondo.

In alternativa, ho provato a mettere l'intestazione della condizione if( ) ...

Totale ordini()==0

Solo un ordine si apre davvero.



Ma questa variante non mi soddisfa perché il giorno successivo la candela data non viene aperta, poiché al momento dell'apertura di questa candela

c'è già un numero casuale di ordini nello scambio.

Ho anche provato a interrompere OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP); interrompere l'esecuzione di start() con return; ..... non ha aiutato.


Vi sarei grato se mi diceste come fare in modo che solo 1 ordine sia aperto a qualsiasi tick entro 1 secondo.

int start()

{
doppio Price=Ask;
doppio SL=Prezzo-300*Punto;
doppio TP=Prezzo+300*Punto;
if( Hour()==10 && Minute()== 00 && Seconds()==00)
OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP);
}

Prova questa variante:
int TimeNow, TimePrev, PrevType;

int start()   
 {
  double Price,SL,TP;
     int Ticket;

  TimeNow=iTime(NULL,0,0);
  if(TimePrev==TimeNow) return(0);

  if(PrevType!=1) {
   Price=NormalizeDouble(Ask,Digits);    
   SL=NormalizeDouble(Price-300*Point,Digits);    
   TP=NormalizeDouble(Price+300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=1; } }

  else if(PrevType!=-1) {
   Price=NormalizeDouble(Bid,Digits);    
   SL=NormalizeDouble(Price+300*Point,Digits);    
   TP=NormalizeDouble(Price-300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_SELL,0.1,Price,3,SL,TP);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }
 }
 
alsu:


Grazie mille per la sua pronta risposta.
 
Diubakin:
Prova questa opzione:
Grazie mille per la sua pronta risposta.
 
Cari professionisti! Dove posso trovare la funzione SloseBy() che funziona in modalità manuale? Voglio aggiungerlo ai miei gufi, in modo da poter chiudere la posizione con il massimo meno a quella con il massimo più, non manualmente, ma automaticamente secondo le condizioni. Non sono riuscito a trovarlo nel codebase. Non l'ho trovato nel codebase, grazie!
 
borilunad:
Ev. professionisti! Dove posso trovare la funzione СloseBy(), che funziona in modalità manuale? Voglio aggiungerlo ai miei gufi, così non sarebbe possibile chiudere la posizione con il massimo meno all'opposto con il massimo più, ma automaticamente, secondo le condizioni. Non sono riuscito a trovarlo nel codebase. Non l'ho trovato nel codebase, grazie!

Prova questa opzione:

bool LockOFF(int EA_Magic) {
 double Result, PrevLoss, PrevProfit;
    int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
   bool Ans;

 MaxProfitTicket=-1; MaxLossTicket=-1;

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(OrderType()>1) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
   PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); } } // end of for

 if(MaxLossTicket==-1) return(false); // нет убыточной позиции
 if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(order_type!=OrderType()) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
   PrevProfit=Result; MaxProfitTicket=OrderTicket(); } } // end of for

 if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

 Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
 if(!Ans) { Print("Ошибка при встречном закрытие"); return(false); }
 
 return(true); }
 

Sergei, a uno sguardo superficiale vale la pena! Lo avvito, faccio le condizioni e lo provo. Grazie mille!

Provato, funziona senza errori! Ora solo per sperimentare con le condizioni, per ottenere l'effetto, e sarà bene! Ma questo è per domani!

Grazie mille. E sogni interessanti!

 
borilunad:
Sergei, a uno sguardo superficiale vale la pena! Lo avvito, faccio le condizioni e lo provo. Grazie mille!
Solo che invece di un comando di contro-chiusura, inserite una funzione di contro-chiusura completa - altrimenti è solo per il tester. E inizializzare le variabili nella funzione.
 
artmedia70:
Solo che invece di un comando di contro-chiusura, inserite una vera e propria funzione di contro-chiusura - altrimenti è solo per il tester. E inizializzare le variabili nella funzione.
Grazie Artyom, era troppo tardi. Farò tutto secondo le regole per l'online oggi!
 
borilunad:
Grazie, Artyom, era troppo tardi. Farà tutto secondo le regole per l'online oggi!
Buona fortuna...
 

Buon pomeriggio. Ho una domanda del genere.

Ho ridisegnato questo indicatore per le mie esigenze con grande difficoltà da pezzi di codice di altri Expert Advisors e Induttori. Non è un grande codice e funziona come voglio io.

La questione è che esegue alcuni calcoli internamente e mostra delle frecce in alto o in basso sul grafico.

Si prega di consigliare come fare un Expert Advisor per aprire un ordine nella giusta direzione quando appare la freccia sul grafico

Più precisamente, ho solo bisogno di sapere quale freccia è attiva ora, penso di poter fare il resto

Ecco un pezzo di codice per renderlo più chiaro; è un'inizializzazione nell'indicatore

   SetIndexBuffer(1, Vverh);

   SetIndexStyle(1,DRAW_ARROW);

   SetIndexArrow(1,233);

   

   SetIndexBuffer(2,Vniz);

   SetIndexStyle(2,DRAW_ARROW);

   SetIndexArrow(2,234); 

Grazie in anticipo