[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non potrei andare da nessuna parte senza di te - 2. - pagina 69

 
Per favore, qualcuno guardi il mio post precedente (a pagina 67). Non riesco a trovare l'errore - gli ordini pendenti non vengono impostati.
 
nemo811:
Per favore, qualcuno guardi il mio post precedente (a pagina 67). Non riesco a trovare l'errore - gli ordini pendenti non vengono impostati.

Non c'è nessun errore. Dovresti stare più attento.

#property copyright "Copyright © 2010, Хлыстов Владимир"
#property link "cmillion@narod.ru"
#property show_inputs
//--------------------------------------------------------------------
extern int stoploss = 0; //уровень выставления SL, если 0, то SL не выставляется
extern int takeprofit = 0; //уровень выставления TP, если 0, то TP не выставляется
extern int Magic = 123456; //уникальный номер ордера
extern bool BUY = false; //открыть ордер BUY
extern bool SELL = false; //открыть ордер SELL
extern bool BUYSTOP = false; //открыть ордер BUYSTOP
extern bool SELLSTOP = false; //открыть ордер SELLSTOP
extern double Lot = 0.1; //объем ордера
extern int slippage = 3; //Максимально допустимое отклонение цены для рыночных ордеров
//--------------------------------------------------------------------
double SL,TP;
//--------------------------------------------------------------------
int start()
{
if (BUY)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0; 
OPENORDER ("Buy");
}
if (SELL)
{ 
if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Bid + stoploss*Point,Digits); else SL=0; 
OPENORDER ("Sell");
}
if (BUYSTOP)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0; 
OPENORDER ("Buy Stop");
}
if (SELLSTOP)
{ 
if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Bid + stoploss*Point,Digits); else SL=0; 
OPENORDER ("Sell Stop");
}
return(0);
}
//--------------------------------------------------------------------
void OPENORDER(string ord)
{
int error,err;
while (true)
{ error=true;
if (ord=="Buy" ) error=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"BUY",Magic,0,Blue);
if (ord=="Sell") error=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,SL,TP,"SELL",Magic,0,Red);
if (ord=="BuyStop" ) error=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask,Digits),SL,TP,"BUYSTOP",Magic,0,Blue);
if (ord=="SellStop") error=OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(Bid,Digits),SL,TP,"SELLSTOP",Magic,0,Red);
if (error==-1) //неудачная покупка OK
{ 
ShowERROR();
err++;Sleep(2000);RefreshRates();
}
if (error || err >10) return;
}
return;
} 
//--------------------------------------------------------------------
void ShowERROR()
{
int err=GetLastError();
switch ( err )
{ 
case 1: return;
case 2: Alert("Нет связи с торговым сервером ",Symbol());return;
case 3: Alert("Error неправильные параметры ",Symbol());return;
case 130: Alert("Error близкие стопы Ticket ",Symbol());return;
case 134: Alert("Недостаточно денег ",Symbol());return;
case 146: Alert("Error Подсистема торговли занята ",Symbol());return;
case 129: Alert("Error Неправильная цена ",Symbol());return;
case 131: Alert("Error Неправильный объем ",Symbol());return;
case 4200:Alert("Error Объект уже существует ",Symbol());return;
default: Alert("Error ",err," ",Symbol());return;
}
}
//--------------------------------------------------------------------
 
gince:

Non c'è nessun errore. Devi stare più attento


No, no, no, no. Stai guardando il post sbagliato. Ce n'è un altro appena sotto :)). La versione che avete controllato non specifica il livello dal prezzo corrente (solo il prezzo corrente) al quale il pendolo dovrebbe essere impostato. Grazie per il vostro feedback.
 
nemo811:

No, no, no. Avete guardato un post sbagliato. Ce n'è un altro appena sotto :)). La versione che hai controllato non contiene il livello dal prezzo corrente (solo il prezzo corrente), al quale il pennacchio dovrebbe essere impostato. Grazie per il vostro feedback.

Qualcosa con la chiamata alla funzione OPENORDER() o con la funzione stessa.

Funziona così

se (BUYSTOP)

{

se (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); altrimenti TP=0;

se (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); altrimenti SL=0;

int error=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask + DistanceSet*Point,Digits),slippage,SL,TP,"",Magic,0);

}

 
gince:

Qualcosa con la chiamata alla funzione OPENORDER() o con la funzione stessa.

Funziona così

se (BUYSTOP)

{

se (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); altrimenti TP=0;

se (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); altrimenti SL=0;

int error=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask + DistanceSet*Point,Digits),slippage,SL,TP,"",Magic,0);

}


Aaaaaaaaah!!! Dei del computer!!! Ci sono passato dieci volte! Perché non funziona? La cosa principale è l'apertura del mercato. Quelli in sospeso sono scritti esattamente sullo stesso principio. Cosa manca? :)))))))
 

Si prega di consigliare come inserire TrailingStopFrCnSAR_v2 in Expert Advisor, che è descritto nel tutorial?

Come faccio a disabilitare l'order tracking, in modo che funzioni quando un altro EA mette un ordine in sospeso o apre un ordine?

 

Urrrrrrra!!!!!!!! Trovato il bug!

Se qualcuno è interessato, ecco una versione funzionante:

#property copyright "Copyright © 2010, Khlystov Vladimir"
#p

roperty link "cmillion@narod.ru"
#proprietà show_inputs
//--------------------------------------------------------------------
extern int stoploss = 0; //livello di esposizione di SL, se 0, SL non è esposto
extern int int takeprofit = 0; //t livello TP, se 0, TP non è esposto
extern int int Magic = 123456; //numero di un ordine
extern bool BUY = false; //aprire ordine BUY
extern bool SELL = false; //aprire un ordine SELL
extern bool BUYSTOP = false; //aprire ordine BUYSTOP
extern bool SELLSTOP = false; //aprire l'ordine SELLSTOP
extern double Lot = 0.1; // volume dell'ordine
extern int slippage = 3; //la massima deviazione di prezzo permessa per gli ordini a mercato
extern int DistanceSet = 20; //distanza di mercato
//--------------------------------------------------------------------
doppio SL,TP;
//--------------------------------------------------------------------
int start()
{
se (COMPRA)
{
se (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); altrimenti TP=0;
se (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); altrimenti SL=0;
OPENORDER ("Comprare");
}
se (VENDERE)
{
se (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); altrimenti TP=0;
se (stoploss!=0) SL = NormalizeDouble(Bid + stoploss*Point,Digits); altrimenti SL=0;
OPENORDER ("Vendere");
}
se (BUYSTOP)
{
se (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); altrimenti TP=0;
se (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); altrimenti SL=0;
OPENORDER ("Buy Stop");
}
se (SELLSTOP)
{
se (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); altrimenti TP=0;
se (stoploss!=0) SL = NormalizeDouble(Bid + stoploss*Point,Digits); altrimenti SL=0;
OPENORDER ("Sell Stop");
}
ritorno(0);
}
//--------------------------------------------------------------------
void OPENORDER(string ord)
{
int errore,err;
mentre (vero)
{ error=true;
se (ord=="Buy" ) error=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"",Magic,0);
se (ord=="Sell") error=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,SL,TP,",Magic,0);
se (ord=="Buy Stop" ) error=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask + DistanceSet*Point,Digits),slippage,SL,TP,"",Magic,0);
se (ord=="Sell Stop") error=OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(Bid - DistanceSet*Point,Digits),slippage,SL,TP,",Magic,0);
se (errore==-1) //fallimento
{
ShowERROR();
err++;Sleep(2000);RefreshRates();
}
se (errore || err >10) ritorno;
}
ritorno;
}
//--------------------------------------------------------------------
void ShowERROR()
{
int err=GetLastError();
interruttore ( err )
{
caso 1: ritorno;
caso 2: Alert("Nessuna connessione al server commerciale ",Symbol());ritorno;
caso 3: Alert("Errore parametri errati ",Symbol()); ritorno;
caso 130: Alert("Errore chiusura biglietto si ferma ",Symbol());ritorno;
caso 134: Alert("Non ci sono abbastanza soldi ",Symbol());ritorno;
caso 146: Alert("Error Trade Subsystem is busy ",Symbol());return;
caso 129: Alert("Errore Prezzo errato ",Simbolo()); ritorno;
caso 131: Alert("Error Incorrect volume ",Symbol()); ritorno;
caso 4200:Alert("Errore L'oggetto esiste già ",Symbol());ritorno;
default: Alert("Error ",err," ",Symbol());return;
}
}
//--------------------------------------------------------------------

Grazie mille a tutti quelli che hanno partecipato alla discussione!!! Da nessuna parte senza di te! :)))))

 
nemo811:

Urrrrrrra!!!!!!!! Trovato l'errore!


Un enorme grazie a tutti coloro che hanno partecipato alla discussione!!! Da nessuna parte senza di te! :)))))

hai ancora un errore nel tuo codice.

Ricorda: gli stop e i take negli ordini pendenti non vengono contati dal prezzo corrente, ma dal prezzo di apertura dell'ordine.

 

AIUTO! Per favore ditemi, se chiudo parte di una posizione (ad esempio ordine per 1 lotto, e chiudo 0,5 lotti) OrderClose ticket dovrebbe cambiare? Il mio tester dice che lo fa... Come evitarlo? Qui sotto c'è un pezzo di codice di chiusura...

1 2011.01.31 06:57 vendere 1 2.55 1.36177 0.00000 0.00000 0.00 10000.00
2 2011.01.31 08:10 chiudere 1 0.51 1.36039 0.00000 0.00000 70.38 10070.38
3 2011.01.31 08:10 vendere 2 2.04 1.36177 0.00000 0.00000 0.0000 10070.38
4 2011.01.31 08:10 chiudere 2 0.40 1.36038 0.00000 0.00000 55.60 10125.98
5 2011.01.31 08:10 vendere 3 1.64 1.36177 0.00000 0.00000 0.00000 10125.98

Un'altra domanda: voglio dividere il mio ordine in 4 parti e chiudere ciascuna di esse quando Cls_S==true si attiva. Ho cercato di usare il contatore... Non funziona...

Qualcuno può darmi un'idea?

Grazie in anticipo!!!!

if (Tip==1 && ((Cls_S0==true&&TotClS==0)||(Cls_S1==true&&TotClS==1)
||(Cls_S2==true&&TotClS==2)||(Cls_S3==true&&TotClS==3)) // Un ordine Sell è aperto.
{ // e c'è un criterio per chiuderlo
Alert("Attempting to close 0.2 Lot Sell ",Ticket,". In attesa di risposta...");
RefreshRates(); // Aggiorna i dati
Ans=OrderClose(Ticket,LotCt,Ask,5);

if (Ans==true) // Ha funzionato :)
{
TotClS++;
Alert ("Closed 0.2 Lot Sell ",Ticket);
break; // Exit from closed loop
}
if (Fun_Error(GetLastError())==1) // Error handling
continue; // Retry
return; // Exit from start()
}
break; // Exit while

 
gince:
Ho fatto un disegno temporaneo del buffer flag[] - è vuoto, ma perché? Dov'è il mio errore?
Non lo so. Sergeev lo sa, ha detto che sembra essere giusto. Vorrei anche vedere come scriverlo correttamente.
L'ho solo corretto un po', in modo che si vedesse qualcosa.
- Ho messo l'indicatore in una finestra separata, poi si può rimettere

- array macd[] era sospeso in aria, l'ha reso un indicatore, ha aumentato la precisione
- fissate la vostra condizione complessa da aprire, mettetene una semplice per la regolazione
- ha cambiato la condizione per la bandiera, quindi almeno funziona.

Poi si possono introdurre gradualmente le condizioni, si vedrà subito dov'è il bug.

File: