Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Ciao!
Per fissare l'indicatore, bisognava sostituire tutti i punti "." con un "" vuoto.
Saluti.
Ho cambiato il tipo di selezione dell'ordine nella funzione scritta del conteggio di certi ordini da selezione dell'ordine a selezione per biglietto.
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}}return(count);}
int count=0;
if(OrderSelect(ticketUP, SELECT_BY_TICKET, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}
Dopo di che, quando si eseguono alcune decine di candele, tutto funziona correttamente e dopo ci sono ripetuti errori nel log:
2016.12.17 17:44:31.609 2016.12.07 00:27 test3 EURUSD,M1: ticket 2 sconosciuto per la funzione OrderModify
2016.12.17 17:44:31.608 2016.12.07 00:25 test3 EURUSD,M1: OrderModify error 4108 // Invalid ticket number.
Ecco il testo completo, l'ho cambiato in tutte e quattro le funzioni:
double slB, tpB, slS, tpS; double x=0, z=0; int ticketUP, ticketD;
void OnTick()
{
double maxpr1=-9999; double minpr1=9999;
for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}
for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}
if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1) Print("ERROR OP_BUY"); else Print("OP_BUY OK");}
if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");}
if (x!=maxpr1){x=maxpr1;
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
OrderModify(ticketD, maxpr1, slS, tpS, 0, Blue);}
if (z!=minpr1){z=minpr1;
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
OrderModify(ticketUP, minpr1, slB, tpB, 0, Red);}
double maxpr=-9999; double minpr=9999;
for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}
for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}}
string a;
if(bars==1)a="bar: ";
else a= IntegerToString(bars,1) + " bar's: ";
Comment("Last ", a, "max ", DoubleToStr(maxpr, 5), ", min ", DoubleToStr(minpr, 5),".");
}
int BuyLimitCount(){
int count=0;
if(OrderSelect(ticketUP, SELECT_BY_TICKET, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}
int BuyCount(){
int count=0;
if(OrderSelect(ticketUP, SELECT_BY_TICKET, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}return(count);}
int SellLimitCount(){
int count=0;
if(OrderSelect(ticketD, SELECT_BY_TICKET, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}return(count);}
int SellCount(){
int count=0;
if(OrderSelect(ticketD, SELECT_BY_TICKET, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}return(count);}
E qui c'è un momento - dopo che ho cambiato la funzione di selezione, la funzione di modifica dell'ordine ha iniziato a generare un errore e solo dopo qualche tempo ditest, all'inizio tutto era normale.
Perché succede questo e come affrontarlo?
Saluti.
Ho cambiato il tipo di selezione dell'ordine nella funzione scritta del conteggio di certi ordini da selezione per ordine a selezione per biglietto.
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}}return(count);}
int count=0;
if(OrderSelect(ticketUP, SELECT_BY_TICKET, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}
Dopo di che, quando si eseguono alcune decine di candele, tutto funziona correttamente e dopo ci sono ripetuti errori nel log:
2016.12.17 17:44:31.609 2016.12.07 00:27 test3 EURUSD,M1: ticket 2 sconosciuto per la funzione OrderModify
2016.12.17 17:44:31.608 2016.12.07 00:25 test3 EURUSD,M1: OrderModify error 4108 // Invalid ticket number.
Ecco il testo completo, l'ho cambiato in tutte e quattro le funzioni:
double slB, tpB, slS, tpS; double x=0, z=0; int ticketUP, ticketD;
void OnTick()
{
double maxpr1=-9999; double minpr1=9999;
for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}
for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}
if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1) Print("ERROR OP_BUY"); else Print("OP_BUY OK");}
if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");}
if (x!=maxpr1){x=maxpr1;
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
OrderModify(ticketD, maxpr1, slS, tpS, 0, Blue);}
if (z!=minpr1){z=minpr1;
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
OrderModify(ticketUP, minpr1, slB, tpB, 0, Red);}
double maxpr=-9999; double minpr=9999;
for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}
for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}}
string a;
if(bars==1)a="bar: ";
else a= IntegerToString(bars,1) + " bar's: ";
Comment("Last ", a, "max ", DoubleToStr(maxpr, 5), ", min ", DoubleToStr(minpr, 5),".");
}
int BuyLimitCount(){
int count=0;
if(OrderSelect(ticketUP, SELECT_BY_TICKET, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}
int BuyCount(){
int count=0;
if(OrderSelect(ticketUP, SELECT_BY_TICKET, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}return(count);}
int SellLimitCount(){
int count=0;
if(OrderSelect(ticketD, SELECT_BY_TICKET, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}return(count);}
int SellCount(){
int count=0;
if(OrderSelect(ticketD, SELECT_BY_TICKET, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}return(count);}
E qui c'è un momento - dopo che ho cambiato la funzione di selezione, la funzione di modifica dell'ordine ha iniziato a generare un errore e solo dopo qualche tempo ditest, all'inizio tutto era normale.
Perché succede questo e come affrontarlo?
Probabilmente ottieni questo errore perché stai cercando di modificare un ordine pendente che è già stato attivato o cancellato. Devi resettare le variabili in cui è memorizzato il biglietto pendente, per esempio, quando l'ordine pendente è stato attivato.
Ciao a tutti, aiutatemi a capire cosa c'è che non va.
il mio Expert Advisor apre ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,0,0, "AV2",1111,0,Green);
for(int prev=0; prev<OrdersTotal();prev++) //Controllo della precedente operazione EA
{
ViborOrdera=OrderSelect(prev,SELECT_BY_POS);
se(OrderSymbol()==Symbol())
//*************************************
//-------Controllare il ciclo di acquisto--------
if(OrderType()==OP_BUY && OrderMagicNumber()==1111)
{
PriceAsk=OrderOpenPrice();//prezzo aperto, necessario per l'ulteriore lavoro dell'EA
}
domanda, dov'è l'errore, non c'è nessun controllo? Il corpo del ciclo è nell'Inite.
Non c'è tempo per risolverlo..........
Cercate di leggere e mettere nei posti giusti.
boolRefreshRates();
Ciao a tutti, aiutatemi a capire cosa c'è che non va.
il mio Expert Advisor apre ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,0,0, "AV2",1111,0,Green);
Domanda: dov'è l'errore, non c'è nessun controllo? Il corpo del ciclo è in Inite.
Non c'è tempo per risolverlo..........
Cercate di leggere e mettere nei posti giusti.
boolRefreshRates();
E dimostrare che è il ciclo che non sta entrando. Inoltre, perché dovremmo controllare TUTTI gli ordini dall'inizio della vita dell'account se abbiamo bisogno degli ultimi?
Prova: Print("Previous PriceAsk-",PriceAsk); il registro è vuoto.
Inoltre, perché dovremmo controllare TUTTI gli ordini dall'inizio della vita dell'account, se abbiamo bisogno degli ultimi? - Come fare altrimenti, se ci sono 10 coppie di valute aperte?
Tutto era OK fino a quando abbiamo cambiato ViborOrdera=OrderSelect(prev,SELECT_BY_POS) in MQL;
Prima eraOrderSelect(prev,SELECT_BY_POS);. È stato molto tempo fa), ma ha funzionato.