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

 
tuner:
fare void start() e non ci sarà alcun errore
Grazie! L'errore è scomparso, ma la posizione ancora non si chiude.
 
rapid_minus:
Grazie! L'errore è scomparso, ma la posizione ancora non si chiude.
Non c'è abbastanza codice per dire esattamente quale sia la causa
 
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;
}
}

 
rapid_minus:


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...

 
evillive:

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

 
rapid_minus:

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());

 
rapid_minus:

Igor Kim ha il nostro come esempio:

...

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
 
evillive:

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ì?

 
rapid_minus:

È 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)))