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

 
void CheckForClose()
  {
   double PriceHigh, PriceLow;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
   
   PriceHigh = iCustom (Symbol(), 0, "ExtremeTMALine", TimeFrame, HalfLength , Price, ATRMultiplier, ATRPeriod, Interpolate, TrendThreshold, Distances, 1, 0); 
   PriceLow = iCustom (Symbol(), 0, "ExtremeTMALine", TimeFrame, HalfLength , Price, ATRMultiplier, ATRPeriod, Interpolate, TrendThreshold, Distances, 2, 0); 
   
   
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
        {
         if(Low[1]<=PriceHigh && Ask>PriceHigh) OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Ask<=PriceLow && High[1]>PriceLow) OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
         break;
        }
     }
//----
  }

artmedia70

Tornando ai miei arieti, per quanto riguarda la chiusura di una posizione quando il prezzo attraversa una linea dell'indicatore. Penso che l'errore sia in questa funzione

se(Volume[0]>1) ritorno;

Ho letto nel tutorial che invece di contare i tick possiamo aprire (chiudere) una posizione all'apparire delle barre. È possibile? Se è così, potete darmi un suggerimento su come programmarlo per la mia situazione.

 
alexey1979621:

artmedia70

Tornando ai miei arieti, per quanto riguarda la chiusura di una posizione quando il prezzo attraversa una linea dell'indicatore. Penso che l'errore sia in questa funzione

se(Volume[0]>1) ritorno;

Ho letto nel tutorial che invece di contare i tick possiamo aprire (chiudere) una posizione all'apparire delle barre. È possibile? Se è così, puoi mandarci un suggerimento su come programmarlo per la mia situazione.

Forse sarà utile:

La funzione restituisce vero quando appare una nuova barra su M15

bool CheckOpenM15()
{
   static int PrevTime=0;
   if (PrevTime==iTime(NULL, PERIOD_M15,0)) return(false);
   PrevTime=iTime(NULL, PERIOD_M15,0);
   return(true);
}
 
ex1m:

Per favore consigliatemi!!!

Sto scrivendo ordini in sospeso in un certo momento

{

Definire il tempo aperto

}

if ((condition)==true)//
{
OrderSend ( OP_BUYSTOPP, parametri);// aprire un ordine BuyStop in sospeso
OrderSend ( OP_SELLSTOP, parametri);// aprire un ordine SellStop in sospeso
}

Penso di aver scritto correttamente il tempo; lo rileva ma per qualche motivo, apre o Sell Stop o Buy Stop e non apre due ordini contemporaneamente. Cerco di aprire due ordini pendenti di tipo diverso (Bistop e Sellstop) allo stesso tempo e uno per uno. La domanda sembra essere primitiva, per favore aiutate i dummies).

Per incollare correttamente il codice qui, clicca prima su SRC e poi copia il codice lì.

Se ho capito bene, ad un certo punto devo aprire un OP_BUYSTOP e un OP_SELLSTOP ? È accettabile avere altri ordini in sospeso in questo momento? Per esempio, ci sono ordini in sospeso, ma dobbiamo cancellare i vecchi prima di aprire i nuovi?

 
artmedia70:
Questo errore si riferisce agli oggetti grafici, non agli ordini

.
Esattamente! L'errore si riferisce agli oggetti, ma non ho oggetti in questo EA...


borilunad:
Buona sera, Victor! Strano, l'ordine in sospeso non è un oggetto! Forse avete qualche oggetto che avrebbe dovuto essere già stato cancellato, ma non lo è stato!

Buon pomeriggio, Boris! L'Expert Advisor non crea oggetti. Questo errore proviene dalla funzione che piazza un ordine pendente. Ecco la versione della funzione (per il tester):

bool OpenPendingBuy(double lot, double price)
{
   int g_ticket = -1;
   double OOP = price + i_distanceFromLastPos * pt;

   if (OOP > Ask)
   {
       fCheck_ValidPendingOOP(Symbol(), OP_BUYSTOP, OOP);
       
       g_ticket = OrderSend(Symbol(), OP_BUYSTOP, lot, ND(OOP), 30, 0, 0, NULL, i_magic, 0, CLR_NONE);
   }
   if (g_ticket > 0)
   {
       return (true);
   }
   else
       pr ("OpenPendingBuy(): Ордер послать не удалось " + GetLastError());
   
   return (false);
}

Se non è stato piazzato alcun ordine, significa che è scattato un blocco:

else
       pr ("OpenPendingBuy(): Ордер послать не удалось " + GetLastError());

Questo è il blocco che riporta un errore.


Qualcuno ha capito la logica?

 
artmedia70:

Dato che non c'è una risposta alla domanda, ecco una funzione che restituirà il biglietto dell'ultimo ordine impostato:



Grazie!!! proprio quello di cui ho bisogno

 
hoz:
Esattamente! L'errore riguarda gli oggetti, ma non ho oggetti in questo EA...

Buon pomeriggio, Boris! L'Expert Advisor non crea oggetti. Questo errore proviene dalla funzione che piazza un ordine pendente. Ecco la versione della funzione (per il tester):

Se l'ordine non è stato piazzato, significa che è scattato un blocco:

Questo è il blocco che riporta un errore.

Qualcuno ha capito la logica?

Quindi, controllare il controllo degli errori? Ci deve essere qualcosa di anomalo lì!
 
borilunad:
Quindi, controllare il controllo degli errori? Ci deve essere qualcosa di anomalo lì!

Heh)) Cosa c'è da glissare su Boris? È tutto trasparente...

pr è una funzione di stampa. E l'errore è già una costante standard. A rigor di logica, non è affatto inaccettabile avere un tale accordo. Se avete ancora un sospetto sulla funzione pr, eccolo qui:

//+-------------------------------------------------------------------------------------+
//| Распринтовка на экран                                                               |
//+-------------------------------------------------------------------------------------+
void pr (string txt)
{
string info [];
ArrayResize(info,20);
string h,m,s,cm; int i;
h=DoubleToStr(Hour(),0);    if (StringLen(h)<2) h="0"+h;
m=DoubleToStr(Minute(),0);  if (StringLen(m)<2) m="0"+m;
s=DoubleToStr(Seconds(),0); if (StringLen(s)<2) s="0"+s;
txt=h+":"+m+":"+s+" - "+txt;
for(i=20-1; i>=1; i--)
info[i]=info[i-1];
info[0]=txt;
for(i=20-1; i>=0; i--)
if(info[i]!=""){
cm=info[i];
ObjectCreate ("txtw"+i,OBJ_LABEL,0,0,0);
ObjectSet    ("txtw"+i,OBJPROP_CORNER,1);
ObjectSet    ("txtw"+i,OBJPROP_XDISTANCE,10);
ObjectSet    ("txtw"+i,OBJPROP_YDISTANCE,30+15*i);
ObjectSetText("txtw"+i,cm, 10, "Times New Roman", Green);}}
 

  • Qualcuno capisce la logica?


Il lotto è normalizzato? Bene e controllate il prezzo.

i_magic, pt, i_distanceFromLastPos sono globali?

 
splxgf:

i_magic, pt, i_distanceFromLastPos sono globali?


Sì. Le variabili con i_ sono variabili di input (dalla parola intut, che può essere modificata dall'utente...), e pt è anche una variabile globale, che è visibile ovunque...
splxgf:


  • Qualcuno capisce la logica?


Il lotto è normalizzato? Bene e controllate il prezzo.


No, il lotto non è stato normalizzato. Non l'ho mai incontrato nel tester... E cosa c'entra il lotto con l'oggetto (errore 4200)?
 
hoz:

Occasionalmente, ma non costantemente, ottengo un errore 4200 quando imposto un ordine pendente. Secondo la documentazione questo errore significa che l'oggetto esiste già:

ERR_OBJECT_ALREADY_EXISTS 4200 Объект уже существует

Risulta che un ordine di questo tipo è già sul mercato quando viene inviato l'ordine pendente?

Forse, qualche altro programma crea un oggetto grafico con lo stesso nome, al quale l'EA reagisce. Forse è necessario cambiare i nomi degli oggetti.
Motivazione: