tuner: Non c'è abbastanza codice per dire esattamente qual è il motivo
Estratto:
void CritCloseBuy() { if (((Yellow_0-Red_0)<(Yellow_1-Red_1) && ((MA_0<MA_1)&&(MA_1>MA_2)) || ((Yellow_0-Red_0)>(Yellow_1-Red_1)&& ((MB_0<MB_1)&&(MB_1>MB_2)))) while(true) { ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red); if (ord_close = false) { Comment("BAY position closing failed with error #",GetLastError());//Messaggio dell'errore break; } else { Ord=0; break; }
}
Potrebbe essere la ragione dell'apertura:
void CritOpen() { if (//condizione di apertura//)
while(true) { ticket=OrderSend(Symbol(),OP_BUY,0..1,Ask,0,0,0,NULL,10011,0,clrNONE); //aprire ordine BAY, MAGIC 10011 if(ticket<=0) { Comment("Apertura della posizione BAY-10011 fallita con errore #",GetLastError());
break; } else { Comment("BAY-10011 posizione aperta con lotto 0.1,prezzo", Ask); Ord=(Ord+1); break; } }
prima di ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red);
sarebbe bello poter selezionare l'ordine utilizzando la funzione OrderSelect(). Non vedo lo scopo di un tale ciclo intorno alla funzione di chiusura...
//+----------------------------------------------------------------------------+ //| Chiudere le posizioni al prezzo di mercato| //| Parametri:| //| sym - nome dello strumento ("" - simbolo corrente)| //| op - operazione(-1 - qualsiasi posizione)| //| mn - MagicNumber(-1 - qualsiasi magia) | //+----------------------------------------------------------------------------+ void ClosePositions(string sym="", int op=-1, int mn=-1) { int i, k=OrdersTotal();
if (sym=="") sym=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sym && (op<0 || OrderType()==op)) { if (mn<0 || OrderMagicNumber()==mn) { if (OrderType()==OP_BUY) { OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy); } if (OrderType()==OP_SELL) { OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell); } } } } } }
Ma il compilatore richiede di controllare il valore di ritorno di OrderClose
Ma il compilatore richiede che il valore di ritorno di OrderClose sia controllato
Bene, fate come nell'esempio - prima selezionate e poi chiudete. Non importa se è l'unico ordine o un milione di ordini, perché ogni ordine deve essere selezionato prima.
Il controllo è molto semplice if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell)) Print("Closing error #", GetLastError());
Ma il compilatore richiede che il valore di ritorno di OrderClose sia controllato
Questo perché ai tempi in cui Igor scriveva le sue funzioni, il compilatore non richiedeva di controllare il valore di ritorno, mentre il compilatore di oggi giura che se non lo fa
Quindi fate come nell'esempio: prima selezionate e poi chiudete. Non importa se c'è un solo ordine o un milione di ordini, ognuno deve essere selezionato per primo.
Il controllo è molto semplice if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell)) Print("Closing error #", GetLastError());
Ho fatto il seguente: if (!OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red)) { Comment("The BAYposition closure failed with error #",GetLastError()); break; } else { Ord=0; break; }
Continua a chiedere "il valore di ritorno dovrebbe essere controllato .
Fatto così:
ord_close=OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red); if (ord_close = false) { Comment("BAY position closing failed with error #",GetLastError()); //Messaggio di errore break; } else { Ord=0; break; }
Silenzioso. Ma in entrambi i casi non chiude la posizione
ZS: Penso che ci sia un errore nella definizione delle condizioni di chiusura e di apertura
Il post qui sopra mostra un esempio di una condizione di chiusura. Cosa potrebbe esserci di sbagliato lì?
È silenzioso. Ma in entrambi i casi non chiude la posizione
ZS: Penso che ci sia un errore nella definizione delle condizioni di chiusura e apertura delle posizioni
Nel post sopra, c'è un esempio di una condizione di chiusura. Cosa potrebbe esserci di sbagliato lì?
Beh, se silenziosamente, senza errori, non si chiude, allora la condizione di chiusura non è giusta. Dobbiamo ripensare e riscrivere proprio questa condizione.
Le parentesi qui sono in qualche modo disposte male:
if (((Yellow_0-Red_0)<(Yellow_1-Red_1) && ((MA_0<MA_1)&&(MA_1>MA_2))) || ((Yellow_0-Red_0)>(Yellow_1-Red_1) && ((MB_0<MB_1)&&(MB_1>MB_2))))
fare void start() e non ci sarà alcun errore
Grazie! L'errore è scomparso, ma la posizione ancora non si chiude.
Non c'è abbastanza codice per dire esattamente qual è il motivo
Estratto:
void CritCloseBuy()
{
if (((Yellow_0-Red_0)<(Yellow_1-Red_1) && ((MA_0<MA_1)&&(MA_1>MA_2)) || ((Yellow_0-Red_0)>(Yellow_1-Red_1)&& ((MB_0<MB_1)&&(MB_1>MB_2))))
while(true)
{
ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red);
if (ord_close = false)
{
Comment("BAY position closing failed with error #",GetLastError());//Messaggio dell'errore
break;
}
else
{
Ord=0;
break;
}
}
Potrebbe essere la ragione dell'apertura:
void CritOpen()
{
if (//condizione di apertura//)
while(true)
{
ticket=OrderSend(Symbol(),OP_BUY,0..1,Ask,0,0,0,NULL,10011,0,clrNONE); //aprire ordine BAY, MAGIC 10011
if(ticket<=0)
{
Comment("Apertura della posizione BAY-10011 fallita con errore #",GetLastError());
break;
}
else
{
Comment("BAY-10011 posizione aperta con lotto 0.1,prezzo", Ask);
Ord=(Ord+1);
break;
}
}
Estratto:
...prima di ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red);
sarebbe bello poter selezionare l'ordine utilizzando la funzione OrderSelect(). Non vedo lo scopo di un tale ciclo intorno alla funzione di chiusura...
prima di ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red);
sarebbe bello poter selezionare l'ordine utilizzando la funzione OrderSelect().
Ho l'unico. Beh, in realtà era così all'inizio. Ho iniziato a cercare la causa usando il metodo del palpeggiamento. Non capisco il senso del ciclo.
Imbroglio solo per analogia: se ho aperto con il loop, allora dovrei chiudere anche...
Igor Kim ha il nostro esempio:
void start() {
ManagePositions();
}
//+----------------------------------------------------------------------------+
//| Chiudere le posizioni al prezzo di mercato|
//| Parametri:|
//| sym - nome dello strumento ("" - simbolo corrente)|
//| op - operazione(-1 - qualsiasi posizione)|
//| mn - MagicNumber(-1 - qualsiasi magia) |
//+----------------------------------------------------------------------------+
void ClosePositions(string sym="", int op=-1, int mn=-1) {
int i, k=OrdersTotal();
if (sym=="") sym=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sym && (op<0 || OrderType()==op)) {
if (mn<0 || OrderMagicNumber()==mn) {
if (OrderType()==OP_BUY) {
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy);
}
if (OrderType()==OP_SELL) {
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell);
}
}
}
}
}
}
Ma il compilatore richiede di controllare il valore di ritorno di OrderClose
Igor Kim ha il nostro esempio:
Ma il compilatore richiede che il valore di ritorno di OrderClose sia controllato
Bene, fate come nell'esempio - prima selezionate e poi chiudete. Non importa se è l'unico ordine o un milione di ordini, perché ogni ordine deve essere selezionato prima.
Il controllo è molto semplice if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell)) Print("Closing error #", GetLastError());
Igor Kim ha il nostro come esempio:
...
Ma il compilatore richiede che il valore di ritorno di OrderClose sia controllato
Quindi fate come nell'esempio: prima selezionate e poi chiudete. Non importa se c'è un solo ordine o un milione di ordini, ognuno deve essere selezionato per primo.
Il controllo è molto semplice if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell)) Print("Closing error #", GetLastError());
Ho fatto il seguente: if (!OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red))
{
Comment("The BAYposition closure failed with error #",GetLastError());
break;
}
else
{
Ord=0;
break;
}
Continua a chiedere "il valore di ritorno dovrebbe essere controllato .
Fatto così:
ord_close=OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);
if (ord_close = false)
{
Comment("BAY position closing failed with error #",GetLastError()); //Messaggio di errore
break;
}
else
{
Ord=0;
break;
}
Silenzioso. Ma in entrambi i casi non chiude la posizione
ZS: Penso che ci sia un errore nella definizione delle condizioni di chiusura e di apertura
Il post qui sopra mostra un esempio di una condizione di chiusura. Cosa potrebbe esserci di sbagliato lì?
È silenzioso. Ma in entrambi i casi non chiude la posizione
ZS: Penso che ci sia un errore nella definizione delle condizioni di chiusura e apertura delle posizioni
Nel post sopra, c'è un esempio di una condizione di chiusura. Cosa potrebbe esserci di sbagliato lì?
Beh, se silenziosamente, senza errori, non si chiude, allora la condizione di chiusura non è giusta. Dobbiamo ripensare e riscrivere proprio questa condizione.
Le parentesi qui sono in qualche modo disposte male:
if (((Yellow_0-Red_0)<(Yellow_1-Red_1) && ((MA_0<MA_1)&&(MA_1>MA_2))) || ((Yellow_0-Red_0)>(Yellow_1-Red_1) && ((MB_0<MB_1)&&(MB_1>MB_2))))
Che ne dite di questo?
if (((Yellow_0-Red_0<Yellow_1-Red_1) && (MA_0<MA_1 && MA_1>MA_2)) || ((Yellow_0-Red_0>Yellow_1-Red_1) && (MB_0<MB_1 && MB_1>MB_2)))