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

 
Shixan:

Pomeriggio.

Ho scritto del codice per aprire due ordini pendenti (BuyStop e SellStop) sulle condizioni a=true e b=true e dopo un certo tempo l'EA chiude entrambi gli ordini, finché non appare un nuovo segnale, ma a volte l'EA apre 2 ordini pendenti nella stessa direzione. Perché questo accade e come evitare questo "bug"?



se (a=true && b=true)
{
int OrderCount = OrdersTotal();
se (OrderCount>1) return(0);
ticket1=OrderSend(Symbol(), OP_BUYSTOP, getLot(), PriceOpen_Buy, slippage, PriceOpen_Sell,0,0,Green);
Dormire(1000);

ticket2=OrderSend(Symbol(), OP_SELLSTOP, getLot(), PriceOpen_Sell, slippage, PriceOpen_Buy,0,0,Green);

Sleep(1000*59*TimeFrame);

for (int i=OrdersTotal()-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
se (OrderType()==OP_BUYSTOP ) OrderDelete(OrderTicket());
se (OrderType()==OP_SELLSTOP ) OrderDelete(OrderTicket());
if (OrderType()==OP_SELL ) OrderClose(OrderTicket(),OrderLots(),Ask, slippage);
if (OrderType()==OP_BUY ) OrderClose(OrderTicket(),OrderLots(),Bid,slippage);
}

ritorno(0);

}


Puoi darmi un suggerimento?

Grazie in anticipo

Non ho guardato il tuo codice, ma... per NON piazzare due o più ordini su UN segnale, fai un controllo PRIMA di piazzare un ordine: c'è un ordine già piazzato su questo segnale? Se non c'è - mettilo su, se c'è - sbuffi di fumo.
 
mario065:

Salve,

È possibile inserire un programma con un peso fisso 1:1 nelle impostazioni?

Se è possibile, per favore ditemi come.

Grazie in anticipo.

Questa biblioteca può.

Sezione "3.3 Funzione per impostare le proprietà del grafico" funzione ServiceSetScaleFix1To1().

La libreria funziona solo con le localizzazioni russa e inglese. Potrebbe funzionare anche nel vostro.

 
Ciao, potresti dirmi perché nella nuova build 451 in MetaEditor quando si compila, il secondo file ex 4 non appare nella cartella experts accanto al file mq 4
 

Ecco la funzione di apertura dell'ordine:

//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell(double price)
{
   int ticket = -1;
   double SL = OrderOpenPrice() + i_sl * pt;
   double TP = OrderOpenPrice() - i_tp * pt;
   
   if (price < Bid)
       ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(price), 3, 0, 0, NULL, i_magic, 0);
       
   if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
   {
      if (i_sl > 0 && OrderStopLoss() == 0)
      {
         if (!OrderModify(ticket, OrderOpenPrice(), ND(SL), ND(TP), 0, Red))
         {
            Print ("Ошибка установки первичного стопа для шортов ", OrderType(), " - ", GetLastError());
            Print("pt = ", pt);
            Print("Ask = ", Ask);
            Print("Bid = ", Bid);
            Print("SL_s = ", OrderOpenPrice() + i_sl * pt);
            Print("TP_s = ", OrderOpenPrice() - i_tp * pt);
         }
      }
   }
       return (true);
}

Ecco la stampa dei parametri:

2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: TP_s = 1.4499
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: SL_s = 1.4519
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: Bid = 1.4513
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ask = 1.4515
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: pt = 0.0001
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ошибка установки первичного стопа для шортов 5 - 4051
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: OrderModify error 4051
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: invalid takeprofit for OrderModify function
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: open #1 sell stop 0.10 EURUSD at 1.45091 ok

Qui possiamo vedere chiaramente che il prezzo TP e SL sono rispettivamente sotto e sopra l'Ask e Bid, cioè tutto è corretto. Ma per qualche motivo ottengo un errore di modifica perché lo stop è sbagliato. Come mai?

 
hoz:

Ecco la funzione di apertura dell'ordine:

Ecco la stampa dei parametri:

Qui puoi vedere chiaramente che il prezzo TP e SL sono rispettivamente sotto e sopra l'Ask e il Bid, cioè tutto è corretto. Ma per qualche motivo ottengo un errore di modifica perché lo stop è sbagliato. Come mai?

Non legge affatto ciò che viene rimproverato?

ERRORE_INVALIDO_FUNZIONE_VALORE_PARAM. 4051 Valore del parametro della funzione non valido

Se non capisci qualcosa, lo risolveremo con il resto del mondo...

ZZY. Quando si inserisce un ordine in sospeso, la stringa

if (price < Bid)

Quando si inserisce un ordine pendente, la stringa non dovrebbe essere del tutto rilevante. Si dovrebbe controllare la corrispondenza con la distanza minima consentita impostata in MarketInfo(Symbol(), MODE_STOPLEVEL). La prima cosa che ha immediatamente attirato la mia attenzione.

Il secondo è quello di stampare il prezzo al quale l'ordine è impostato. Lo Stop e il Take non dovrebbero essere impostati rispetto all'Ask e al Bid, ma rispetto al prezzo di impostazione dell'ordine

 
Zhunko:

Questa biblioteca può.

Sezione "3.3 Funzioni di impostazione delle proprietà del grafico" funzione ServiceSetScaleFix1To1().

La biblioteca funziona solo con le localizzazioni russa e inglese. Potrebbe funzionare anche nel vostro.

Grazie Zhunko.
 
artmedia70:

Leggete almeno quello che viene rimproverato?

ERRORE_INVALIDO_FUNZIONE_VALORE_PARAM. 4051 Valore non valido del parametro della funzione

Guarda i parametri passati alla funzione chiamata. Quando non c'è più niente di chiaro, lo risolveremo in pace...


Certo che lo sto leggendo, è per questo che sono curioso. Ho scollegato tutti i parametri di input.

Questo è quello che ho ottenuto:

bool OpenSell(double price)
{
   int ticket = -1;
   double SL = OrderOpenPrice() + i_sl * pt;
   double TP = OrderOpenPrice() - i_tp * pt;
   
   if (price < Bid)
       ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(price), 3, 0, 0, NULL, i_magic, 0);
       
   if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
   {
      if (i_sl > 0 && OrderStopLoss() == 0)
      {
         Print("ND(price) = ", DoubleToStr(ND(price),Digits));
         Print("ND(SL) = ", DoubleToStr(ND(SL),Digits));
         Print("ND(TP) = ", DoubleToStr(ND(TP),Digits));
         Print("ND(OOP) = ", DoubleToStr(ND(OrderOpenPrice()),Digits));
         if (!OrderModify(ticket, ND(OrderOpenPrice()), ND(SL), ND(TP), 0, Red))
         {
            Print ("Ошибка установки первичного стопа для шортов ", OrderType(), " - ", GetLastError());
            Print("pt = ", pt);
            Print("Ask = ", Ask);
            Print("Bid = ", Bid);
            Print("SL_s = ", OrderOpenPrice() + i_sl * pt);
            Print("TP_s = ", OrderOpenPrice() - i_tp * pt);
         }
      }
   }
       return (true);
}

Ecco cosa c'è nel registro:

2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: TP_s = 1.4485
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: SL_s = 1.4505
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: Bid = 1.4496
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ask = 1.4497
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: pt = 0.0001
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ошибка установки первичного стопа для шортов 5 - 4051
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: OrderModify error 4051
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: invalid takeprofit for OrderModify function
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(OOP) = 1.44946
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(TP) = -0.00100
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(SL) = 0.00100
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(price) = 1.44946
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: open #4 sell stop 0.10 EURUSD at 1.44946 ok

Alcuni ordini sono modificati e altri no. I valori di ND(TP), ND(SL) all'inizio sono stati riportati a caso. Perché?

La funzione di normalizzazione, a proposito, è mia:

//+-------------------------------------------------------------------------------------+
//| Функция нормализации                                                                |
//+-------------------------------------------------------------------------------------+
double ND(double A)
{
  return (NormalizeDouble(A, Digits));
}
 
artmedia70:

Leggete almeno quello che viene rimproverato?

ERRORE_INVALIDO_FUNZIONE_VALORE_PARAM. 4051 Valore non valido del parametro della funzione

Vedere i parametri passati alla funzione da chiamare.Quando non c'è niente di chiaro, lo risolveremo con il mondo...

ZS. Quando si inserisce un ordine pendente la linea

if (price < Bid)

Questo non è del tutto appropriato. Dovreste controllare se la distanza minima consentita corrisponde a quella specificata in MarketInfo(Symbol(), MODE_STOPLEVEL). La prima cosa che ha attirato subito la mia attenzione.



Di solito incontro controlli simili per la modifica dell'ordine ma non per l'apertura. L'ho già visto. Se il prezzo del bystop in sospeso è inferiore a quello di Ask, sarà un errore. E se imposto uno stop di 10 pips sarà sicuramente più alto del valore di StopLoss. Non faccio trading sui tick :)
 
artmedia70:


In secondo luogo, stampa il prezzo a cui è impostato l'ordine. Stop e Take non dovrebbero essere posizionati rispetto all'Ask e al Bid, ma rispetto al prezzo al quale l'ordine è impostato



Immagino che questo sia per la modifica? Dopo tutto, sono Bid e Ask che sono importanti per noi quando apriamo l'ordine. Ho chiarito tutto con il post sopra.
 

Buon pomeriggio,

Voglio far funzionare un EA su diverse finestre allo stesso tempo. Ma solo un ordine può essere aperto per ogni strumento. Pertanto, ora c'è una condizione:

int totale = OrdiniTotali();

se (totale<1) { analisi e blocco posizione aperta} altrimenti { analisi e blocco posizione chiusa }

Ora, se viene aperto su due simboli allo stesso tempo, l'apertura su uno sarà bloccata sull'altro. Ecco perché ho inventato qualcosa di simile:

int totale = OrdiniTotali();

int cnt;

if(total>0)
{
for(cnt=0;cnt<totale;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol())
{
Symbol_FLAG = true;
}
}
}

if(total<1 || total>0 && Symbol_FLAG == false) { analisi e apertura blocco ptposition}

ma non funziona sul tester...

Forse tu puoi dirmi, forse sto facendo qualcosa di irrealizzabile?