Ciao, cari programmatori! Potete consigliare a un principiante come scrivere, se possibile, uno script (non un Expert Advisor) che piazzi un ordine di trading e allo stesso tempo abiliti la funzione Trailing Stop per esso a un livello minimo? Forse ce n'è uno già pronto, allora se puoi dammi un link.
Ecco una parte del codice (il codice principale è preso dal manuale di costruzione di Expert Advisor)
// Funzione d'ordine // Variabili globali: // Mas_Ord_New[31][9] // Array degli ultimi ordini conosciuti // Mas_Ord_Old[31][9] // Array degli ordini precedenti (vecchi) // 1° indice = numero d'ordine // [][0] non è definito // [][1] prezzo dell'ordine aperto (abs. di un ordine (tasso abc) // [][2] StopLoss di un ordine (tasso abc) // [][3] TakeProfit di un ordine (tasso abc) // [][4] Numero di ordine // [][5] numero di lotti di un ordine. (Abc Rate) // [][6] Tipo di ordine 0=B,1=S,2=BL,3=SL,4=BS,5=SS // [][7] numero magico dell'ordine // [][8] 0/1
se (Mas_Ord_Old[vecchio][6]==0 && Bid>Mas_Ord_Old[vecchio][2] && Bid<Mas_Ord_Old[vecchio][3]) Inform(1, Mas_Ord_Old[old][4]); // Quindi l'ordine Buy è stato chiuso dal segnale del contatore else if (Mas_Ord_Old[old][6]==0 && Bid<=Mas_Ord_Old[old][2]) Inform(19,Mas_Ord_Old[old][4],Mas_Ord_Old[old][2]) // significa che SL è scattato else if (Mas_Ord_Old[old][6]==0 && Bid>=Mas_Ord_Old[old][3]) Inform(20,Mas_Ord_Old[old][4],Mas_Ord_Old[old][3]) // TA attivato
else if (Mas_Ord_Old[old][6]==1 && Ask<Mas_Ord_Old[old][2] && Ask>Mas_Ord_Old[old][3]) Inform(2, Mas_Ord_Old[old][4]); // Così l'ordine Sell è chiuso dal segnale del contatore else if (Mas_Ord_Old[old][6]==1 && Ask>=Mas_Ord_Old[old][2]) Inform(19,Mas_Ord_Old[old][4],Mas_Ord_Old[old][2]) // significa che SL è scattato else if (Mas_Ord_Old[old][6]==1 && Ask<=Mas_Ord_Old[old][3]) Inform(20,Mas_Ord_Old[old][4],Mas_Ord_Old[old][3]); // TA ha scattato
Il resto non è di alcun interesse...
Il problema: nel 90% dei casi viene mostrato il parametro corretto, cioè se SL è attivato, il parametro è "19", se TP è "20", se l'ordine viene chiuso manualmente, o da un segnale di contatore, il parametro è "1" o "2". È stato progettato così.
Ma a volte (abbastanza spesso) invece di "20" restituisce "19" (o viceversa), o anche "1"("2"). Per favore, aiutatemi a descrivere correttamente la funzione "if": come condizioni di motivi di chiusura dell'ordine.
Penso che la ragione possa essere l'arrotondamento dei prezzi?
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
Finora, proprio così:
//+------------------------------------------------------------------+
//| Fibo trading.mq4 |
//| Minodi |
//| minodi@yandex.ru |
//+------------------------------------------------------------------+
#proprietà copyright "Minodi"
#proprietà link "minodi@yandex.ru"
extern int period_EMA = 233,
periodo_SMA = 233,
stoploss = 30,
extern double Lot = 0,01;
extern string SesEnd ="22:00"; //tempo limite per Hai o Low
//+------------------------------------------------------------------+
//| funzione di avvio del programma script |
//+------------------------------------------------------------------+
int start()
{
//------- Prezzi giornalieri, Fibs e Hi-Low rendering time--------------+
int shift = iBarShift(NULL,1440,Time[0]) + 1;
double HiPrice = iHigh(NULL,1440,shift); //prezzo alto
double LoPrice = iLow(NULL,1440,shift); // prezzo basso
double OpPrice = iOpen (NULL,1440,shift); //open price
double ClPrice = iClose (NULL,1440,shift); // Prezzo di chiusura
datetime StTime = iTime(NULL,1440,shift); // ?
se(TimeDayOfWeek(StTime)==0/*Domenica*/)
{//Aggiungi il massimo e il minimo del venerdì
HiPrice = MathMax(HiPrice,iHigh(NULL,1440,shift+1));
LoPrice = MathMin(LoPrice,iLow(NULL,1440,shift+1));
OpPrice = iOpen(NULL,1440,shift+1);
ClPrice = iClose (NULL,1440,shift+1);
}
doppio Pivot =(HiPrice+LoPrice+ClPrice)/3;
double Range =HiPrice-LoPrice;
doppio Fibo138 =1,382*Range+LoPrice;
doppio Fibo162 =1,618*Range+LoPrice;
doppio Fibo_138 =LoPrice-(1,382*Range-Range);
doppio Fibo_162 =LoPrice-(1,618*Range-Range);
//---------------- HiTime e Low-----------------------------------------+
int HiTime,LoTime;
int time; // sulla prossima barra rotola i valori
if (time!=Time[0]){HiTime=0;LoTime=0;time=Time[0];}
se (High[0]>HiPrice)HiTime=TimeCurrent();
se (Low[0]<LoPrice)LoTime=TimeCurrent();
Comment("Su questa barra: "+"\n Time High Point="+HiTime+"\n Time Low Point="+LoTime);
//-----------------Ценовой диапазон Демарка-------------------------------+
int currDay, i=0; //
se (currDay!=TimeDay(Time[i]))
{
se (ClPrice<OpPrice) double x=(HiPrice + LoPrice + LoPrice)/2;
se (ClPrice>OpPrice) x=(HiPrice + LoPrice + ClPrice + HiPrice)/2;
se (ClPrice==OpPrice) x=(HiPrice + LoPrice + ClPrice + ClPrice)/2;
i++;
}
double MaxDay = x - LoPrice; // demarca la gamma dei prezzi
double MinDay = x - HiPrice; // demarca la gamma dei prezzi
// -----------Скользящие средние---------------------------------------------+
double EMA = iMA(15,0,period_EMA,0,MODE_EMA, PRICE_CLOSE,0);
double SMA = iMA(15,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);
double EMA1 = iMA(60,0,period_EMA,0,MODE_EMA,PRICE_CLOSE,0);
double SMA1 = iMA(60,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);
//----------------Удаление вчерашних ордеров---------------------------------+
//------------------Ордера----------------------------------------------------+
Cari membri del forum, controllate il codice, ho intenzione di aggiungere gradualmente
Questi sono i parametri che ti ho dato, mettili prima di iniziare
int HiTime,LoTime;
int time; // на следующем баре обнкляем значения
Вот эти параметры ято я давал, поместите перд стартом
int HiTime,LoTime;
int time; // на следующем баре обнкляем значения
Cari membri del forum, per favore prestate attenzione e diteci quali errori sono stati fatti:
//+------------------------------------------------------------------+
//| Fibo trading.mq4 |
//| Minodi |
//| minodi@yandex.ru |
//+------------------------------------------------------------------+
#proprietà copyright "Minodi"
#proprietà link "minodi@yandex.ru"
extern int period_EMA = 233,
periodo_SMA = 233,
stoploss = 30,
Magia = 55;
extern double Lot = 0,01;
extern string SesEnd ="22:00"; //tempo limite per Hai o Low
int HiTime,LoTime;
int time; // sulla prossima barra arrotola i valori
//+------------------------------------------------------------------+
//| funzione di avvio del programma script |
//+------------------------------------------------------------------+
int start()
{
//------- Prezzi giornalieri, Fibs e rendering High-Low time--------------+
int shift = iBarShift(NULL,1440,Time[0]) + 1;
double HiPrice = iHigh(NULL,1440,shift); //prezzo alto
double LoPrice = iLow(NULL,1440,shift); // prezzo basso
double OpPrice = iOpen (NULL,1440,shift); //open price
double ClPrice = iClose (NULL,1440,shift); // Prezzo di chiusura
datetime StTime = iTime(NULL,1440,shift); // ?
se(TimeDayOfWeek(StTime)==0/*Domenica*/)
{//Aggiungi il massimo e il minimo del venerdì
HiPrice = MathMax(HiPrice,iHigh(NULL,1440,shift+1));
LoPrice = MathMin(LoPrice,iLow(NULL,1440,shift+1));
OpPrice = iOpen(NULL,1440,shift+1);
ClPrice = iClose (NULL,1440,shift+1);
}
doppio Pivot =(HiPrice+LoPrice+ClPrice)/3;
double Range =HiPrice-LoPrice;
doppio Fibo138 =1,382*Range;
doppio Fibo162 =1.618*Range;
double Fibo_138 =(LoPrice-1.382*Range)-Range;
double Fibo_162 =(LoPrice-1.618*Range)-Range;
//---------------- tempo hai e basso-----------------------------------------+
if (time!=Time[0]){HiTime=0;LoTime=0;time=Time[0];}
se (High[0]>HiPrice)HiTime=TimeCurrent();
se (Low[0]<LoPrice)LoTime=TimeCurrent();
Comment("Su questa barra: "+"\n Time High Point="+HiTime+"\n Time Low Point="+LoTime);
//-----------------Ценовой диапазон Демарка-------------------------------+
int currDay, i=0; //
se (currDay!=TimeDay(Time[i]))
{
se (ClPrice<OpPrice) double x=(HiPrice + LoPrice + LoPrice)/2;
se (ClPrice>OpPrice) x=(HiPrice + LoPrice + ClPrice + HiPrice)/2;
se (ClPrice==OpPrice) x=(HiPrice + LoPrice + ClPrice + ClPrice)/2;
i++;
}
double MaxDay = x - LoPrice; // demarca la gamma dei prezzi
double MinDay = x - HiPrice; // Demark range di prezzo
// -----------Скользящие средние---------------------------------------------+
double EMA = iMA(15,0,period_EMA,0,MODE_EMA, PRICE_CLOSE,0);
double SMA = iMA(15,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);
double EMA1 = iMA(60,0,period_EMA,0,MODE_EMA,PRICE_CLOSE,0);
double SMA1 = iMA(60,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);
//------------------Ордера----------------------------------------------------+
se (HiTime>LoTime){
int ticket1 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,HiPrice,0,0,0,Pivot,NULL,Magic,58000,Red);
int ticket2 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,HiPrice,0,0,LoPrice,NULL,Magic,58000,Red);
int ticket3 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo138,0,0,HiPrice,NULL,Magic,58000,Red);
int ticket4 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo138,0,0,LoPrice,NULL,Magic,58000,Red);
int ticket5 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo162,0,0,HiPrice,NULL,Magic,58000,Red);
int ticket6 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo162,0,0,Pivot,NULL,Magic,58000,Red);
}
se (HiTime<LoTime){
int ticket7=OrderSend(Symbol(),OP_BUYLIMIT,Lot,LoPrice,0,0,0,Pivot,NULL,Magic,58000,Red);
int ticket8=OrderSend(Symbol(),OP_BUYLIMIT,Lot,LoPrice,0,0,HiPrice,NULL,Magic,58000,Red);
int ticket9=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_138,0,0,LoPrice,NULL,Magic,58000,Red);
int ticket10=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_138,0,0,Pivot,NULL,Magic,58000,Red);
int ticket11=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_162,0,0,LoPrice,NULL,Magic,58000,Red);
int ticket12=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_162,0,0,Pivot,NULL,Magic,58000,Red);
}
se (HiTime>LoTime && ClPrice>Pivot) {
int ticket13=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Pivot,0,0,HiPrice,NULL,Magic,58000,Red);
int ticket14=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Pivot,0,0,Fibo138,NULL,Magic,58000,Red);
}
se (HiTime<LoTime && ClPrice<Pivot)
int ticket15=OrderSend(Symbol(),OP_SELLLIMIT,Lot,Pivot,0,0,LoPrice,NULL,Magic,58000,Red);
int ticket16=OrderSend(Symbol(),OP_SELLLIMIT,Lot,Pivot,0,0,Fibo_138,NULL,Magic,58000,Red);
}
ritorno(0);
//+------------------------------------------------------------------+
a prima vista i parametri:
int currDay;
per iniziare
Signori del forum, aiuto per capire....
Ecco una parte del codice (il codice principale è preso dal manuale di costruzione di Expert Advisor)
// Funzione d'ordine
// Variabili globali:
// Mas_Ord_New[31][9] // Array degli ultimi ordini conosciuti
// Mas_Ord_Old[31][9] // Array degli ordini precedenti (vecchi)
// 1° indice = numero d'ordine
// [][0] non è definito
// [][1] prezzo dell'ordine aperto (abs. di un ordine (tasso abc)
// [][2] StopLoss di un ordine (tasso abc)
// [][3] TakeProfit di un ordine (tasso abc)
// [][4] Numero di ordine
// [][5] numero di lotti di un ordine. (Abc Rate)
// [][6] Tipo di ordine 0=B,1=S,2=BL,3=SL,4=BS,5=SS
// [][7] numero magico dell'ordine
// [][8] 0/1
se (Mas_Ord_Old[vecchio][6]==0 && Bid>Mas_Ord_Old[vecchio][2] && Bid<Mas_Ord_Old[vecchio][3])
Inform(1, Mas_Ord_Old[old][4]); // Quindi l'ordine Buy è stato chiuso dal segnale del contatore
else if (Mas_Ord_Old[old][6]==0 && Bid<=Mas_Ord_Old[old][2])
Inform(19,Mas_Ord_Old[old][4],Mas_Ord_Old[old][2]) // significa che SL è scattato
else if (Mas_Ord_Old[old][6]==0 && Bid>=Mas_Ord_Old[old][3])
Inform(20,Mas_Ord_Old[old][4],Mas_Ord_Old[old][3]) // TA attivato
else if (Mas_Ord_Old[old][6]==1 && Ask<Mas_Ord_Old[old][2] && Ask>Mas_Ord_Old[old][3])
Inform(2, Mas_Ord_Old[old][4]); // Così l'ordine Sell è chiuso dal segnale del contatore
else if (Mas_Ord_Old[old][6]==1 && Ask>=Mas_Ord_Old[old][2])
Inform(19,Mas_Ord_Old[old][4],Mas_Ord_Old[old][2]) // significa che SL è scattato
else if (Mas_Ord_Old[old][6]==1 && Ask<=Mas_Ord_Old[old][3])
Inform(20,Mas_Ord_Old[old][4],Mas_Ord_Old[old][3]); // TA ha scattato
Il resto non è di alcun interesse...
Il problema: nel 90% dei casi viene mostrato il parametro corretto, cioè se SL è attivato, il parametro è "19", se TP è "20", se l'ordine viene chiuso manualmente, o da un segnale di contatore, il parametro è "1" o "2". È stato progettato così.
Ma a volte (abbastanza spesso) invece di "20" restituisce "19" (o viceversa), o anche "1"("2"). Per favore, aiutatemi a descrivere correttamente la funzione "if": come condizioni di motivi di chiusura dell'ordine.
Penso che la ragione possa essere l'arrotondamento dei prezzi?