Per favore, aiuta a scrivere EA gratis. 5 idee diverse. - pagina 15

 

Questo è tutto. Capisco, "cercando" di aiutare. Sento che è il momento di condividere altre idee.

 
GeneratorID:

Questo è tutto. Capisco, "cercando" di aiutare. Sento che è il momento di condividere altre idee.


Chi sarebbe interessato alla "vecchia bicicletta"? Non hai ancora capito che quello che stai cercando di iniziare ad esplorare è da tempo nel forum e ci sono implementazioni gratuite nel codice base - guarda e gioca in giro. Avete le vostre idee? Altrimenti non c'è niente da discutere.
 

Per favore aiutami ad aggiungere il numero massimo di ordini aperti al consulente!

//+------------------------------------------------ ------+

//| v128-2.mq4 |

//| Copyright © 2011, Andrey N. Bolkonsky |

//| 21/03/2011 |

//| e-mail: abolk@yandex.ru | Skype: abol1 |

//+------------------------------------------------ ------+

#proprietà copyright "Copyright © 2011, Andrey N. Bolkonsky"

#link proprietà "abolk@yandex.ru"


//

stringa esterna rem2 = "=== Numero di lotti ===";

doppio esterno _Lots0_1 = 0,1; // Livello base (per il 1° ordine)

doppio esterno _Lots0_2 = 0,1; // Livello base (per il 2° ordine)

//

stringa esterna rem3 = "=== Parametri aggiuntivi ===";

int esterno _TakeProfit1_Proc = 50; // Rischio percentuale per prendere profitto del 1° ordine

extern int _SpaseFromMaxMin = 1; // Offset dall'alto/dal basso

//

stringa esterna rem4 = "=== Parametri di pareggio ===";

bool esterno _IsStopLoss_0 = falso; // Abilitazione all'uso del livello di pareggio

extern int _StopLoss_0_Da = 0; // Compensazione dal livello di pareggio (in punti)

extern int _StopLoss_0_Level = 15; // Livello di pareggio

//

stringa esterna rem5 = "=== Parametri del trailing stop ===";

bool esterno _IsTrailingStop = false; // Abilita il trailing stop

bool _IsTrailingStopProfit = true; // Abilitazione di un trailing stop da una posizione di pareggio

//extern int _TrailingStopProfit_From = 0; // Compensazione dal livello di pareggio (in punti)

extern int _TrailingStopLevel = 15; // Livello di trailing stop

extern int _TrailingStopStep = 5; // Fase di spostamento del trailing stop

//

stringa esterna rem6 = "=== Impostazioni utensile ===";

stringa esterna _Symboll = ""; // Nome simbolico dello strumento: "" - simbolo corrente

extern int _Timeframe = 0; // Periodo: 0 - periodo del grafico corrente

int_cifre; // Numero di cifre dopo il punto decimale del prezzo

doppi _Punti; // Dimensione dei punti nella valuta delle quotazioni

extern int _Slippage = 2; // slittamento

int esterno _Magic1 = 1281; // Numero univoco di ordini EA (1° ordine)

int esterno _Magic2 = 1282; // Numero univoco di ordini EA (2° ordine)

//

stringa esterna rem7 = "=== Parametri indicatore MA1 ===";

extern int _MA1_Timeframe = PERIOD_D1; // Periodo: 0 - periodo del grafico corrente

extern int _MA1_Period = 20; // Periodo medio per il calcolo della media mobile

int esterno _MA1_Shift = 0; // Spostamento dell'indicatore rispetto al grafico dei prezzi

int esterno _MA1_Metodo = 0; // Metodo di media: 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA

extern int _MA1_Applied_Price = 0; // Prezzo usato: 0 - chiude, 1 - apre, 2 - alto, 3 - basso

//

stringa esterna rem8 = "=== parametri indicatore MA2 ===";

extern int _MA2_Timeframe = PERIOD_H4; // Periodo: 0 - periodo del grafico corrente

extern int _MA2_Period = 20; // Periodo medio per il calcolo della media mobile

int esterno _MA2_Shift = 0; // Spostamento dell'indicatore rispetto al grafico dei prezzi

int esterno _MA2_Metodo = 0; // Metodo di media: 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA

extern int _MA2_Applied_Price = 0; // Prezzo usato: 0 - chiude, 1 - apre, 2 - alto, 3 - basso

//

stringa esterna rem9 = "=== Parametri dell'indicatore delle bande di Bollinger ===";

//extern int _BB_Timeframe = 0; // Periodo: 0 - periodo del grafico corrente

extern int _BB_Period = 20; // Periodo medio della linea dell'indicatore principale

extern int _BB_Deviation = 2; // Deviazione dalla linea principale

int esterno _BB_Bands_Shift = 0; // Spostamento dell'indicatore rispetto al grafico dei prezzi

extern int _BB_Applied_Price = 0; // Prezzo usato: 0 - chiudi

//

stringa esterna rem10 = "=== parametri dell'indicatore ZigZag ===";

//extern int _ZZ_Timeframe = 0; // Periodo: 0 - periodo del grafico corrente

extern int _ZZ_ExtDepth = 12;

extern int _ZZ_ExtDeviation = 5;

extern int _ZZ_ExtBackstep = 3;

//

datetime_TimePrevious;

datetime _TimeCurrent;

//

stringa_fstr;

int_tp;

//




void MaxOrders(int max_orders=5);











//=++============================================== ======================= = =================++=

int init()

{

if(_Symbol == "") _Symboll = Symbol();

//

_Digitss = MarketInfo(_Simbolo, MODE_DIGITS);

_Punti = MarketInfo(_Simbolo, MODE_POINT);

//

if(_Timeframe == 0) _Timeframe = Periodo();

Print("v128-2 > init() >> _Timeframe=", _Timeframe,

"rem4=",_IsStopLoss_0,

"rem5=",_IsTrailingStop,_IsTrailingStopProfit);

//

_fstr = "v128_";

_tp = _FileReadWriteDouble(_fstr+"_tp.dat", 0); // assicurati che il file esista, se non esiste crealo

Print("v128-2 > init() >> _Timeframe=", _Timeframe, " _tp=",_tp);

//

_TimePrevious=iTime(_Simbolo, _Timeframe, 0);

//

Print("v128-2 > Fatto: init() >> _TimePrevious=", _TimePrevious, " (", TimeToStr(_TimePrevious,TIME_DATE|TIME_MINUTES), ")");

ritorno(0);

}



//=++============================================== ======================= = =================++=

inizio int()

{

doppia P_Chiudi1, P_Chiudi2;

doppia BB_1_superiore, BB_1_inferiore;

doppio MA1_0, MA2_0;

doppia P_ask, P_bid;

bool is_signal_2_buy, is_signal_2_sell;

doppio P1_acquisto, P2_acquisto, P3_acquisto;

doppio P1_vendita, P2_vendita, P3_vendita;

bool is_b1 = falso, is_s1 = falso;

bool is_b2 = falso, is_s2 = falso;

biglietto intero;

//

_TimeCurrent = iTime(_Simbolo, _Timeframe, 0);

if(_TimeCurrent != _TimePrevious)

{

MA1_0 = iMA(_Simbolo, _MA1_Lasso di tempo, _MA1_Periodo, _MA1_Spostamento, _MA1_Metodo, _MA1_Prezzo_applicato, 0);

MA2_0 = iMA(_Simbolo, _MA2_Lasso di tempo, _MA2_Periodo, _MA2_Spostamento, _MA2_Metodo, _MA2_Prezzo_applicato, 0);

BB_1_upper = iBands(_Simbolo, _Timeframe, _BB_Period,_BB_Deviation,_BB_Bands_Shift,_BB_Applied_Price, MODE_UPPER, 1);

BB_1_lower = iBands(_Simbolo, _Timeframe, _BB_Period,_BB_Deviation,_BB_Bands_Shift,_BB_Applied_Price, MODE_LOWER, 1);

P_Chiudi1 = iChiudi(_Simbolo, _Lasso di tempo, 1);

P_Chiudi2 = iChiudi(_Simbolo, _Lasso di tempo, 2);

P_ask = MarketInfo(_Simbolo, MODE_ASK);

P_bid = MarketInfo(_Simbolo, MODE_BID);

Print("v120-4 > ", _Simbolo, " | ", _Lasso di tempo,

" -> MA1_0=", MA1_0, " | MA2_0=", MA2_0,

" -> BB_1_upper=", BB_1_upper, " | BB_1_lower=", BB_1_lower,

" -> P_Chiudi1=", P_Chiudi1, " | P_Chiudi2=", P_Chiudi2,

" -> ask=", P_ask, " | bid=", P_bid);

//

is_signal_2_buy = P_bid >= MA1_0 && P_bid >= MA2_0 && P_Close1 >= BB_1_lower && P_Close2 <= BB_1_lower && P_bid >= BB_1_lower;

is_signal_2_sell = P_bid <= MA1_0 && P_bid <= MA2_0 && P_Close1 <= BB_1_upper && P_Close2 >= BB_1_upper && P_bid <= BB_1_upper;

Print("v128-2 > ", _Simbolo, " | ", _Lasso di tempo,

" -> is_signal2 -> buy=", is_signal_2_buy, " | sell=", is_signal_2_sell);

// ========== per mercato

// ========== apertura di un ordine ACQUISTA

if( is_signal_2_buy )

{

Print("v128-2 > ", _Simbolo, " | ", _Lasso di tempo,

" -> segnale per aprire un ordine ACQUISTA");

OrdersDeleteAll(OP_SELL);

//

se(!è_b1 || !è_b2)

{

P1_acquistare = P_chiedere;

P3_buy = TrovaPrezzoMinMax(false) - (_SpaseFromMaxMin) * _Punto;

_tp = (P1_acquisto - P3_acquisto) / _Punto * (_TakeProfit1_Proc / 100.0);

P2_buy = DoubleTestZero(_tp, P1_buy + (_tp) * _Point);

//

_FileWriteDouble(_fstr+"_tp.dat", _tp);

//

Print("v128-2 > ", _Simbolo, " | ", _Lasso di tempo,

" -> ACQUISTA -> P1_buy=", P1_buy, " | P2_buy=", P2_buy, " | P3_buy=", P3_buy, "_tp=", _tp);

//

ticket = OrderSend(_Symbol, OP_BUY, _Lots0_1, ND(P1_buy), _Slippage, ND(P3_buy), ND(P2_buy),

NULL, _Magic1, 0, CLR_NONE);

se(biglietto == -1)

Print("v128-2 > ", _Simbolo, " | ", _Lasso di tempo,

" -> ACQUISTA (1) > Errore (apertura) #", GetLastError());

altrimenti è_b1 = vero;

//

ticket = OrderSend(_Symbol, OP_BUY, _Lots0_2, ND(P1_buy), _Slippage, ND(P3_buy), 0,

NULL, _Magic2, 0, CLR_NONE);

se(biglietto == -1)

Print("v128-2 > ", _Simbolo, " | ", _Lasso di tempo,

" -> ACQUISTA (2) > Errore (apertura) #", GetLastError());

altrimenti è_b2 = vero;

//

}

altrimenti { is_b1 = vero; is_b2 = vero; }

}

altrimenti { is_b1 = vero; is_b2 = vero; }

//Stampa("= compra +++",è_b1,è_b2,"==",è_s1,è_s2);

// ========== apertura di un ordine VENDITA

if( is_signal_2_sell )

{

Print("v128-2 > ", _Simbolo, " | ", _Lasso di tempo,

" -> segnale per aprire un ordine VENDITA");

OrdersDeleteAll(OP_BUY);

//

se(!è_s1 || !è_s2)

{

P1_vendita = P_offerta;

P3_sell = TrovaPrezzoMinMax(true) + (_SpaseFromMaxMin) * _Punto;

_tp = (P3_sell - P1_sell) / _Punto * (_TakeProfit1_Proc / 100.0);

P2_sell = DoubleTestZero(_tp, P1_sell - (_tp) * _Point);

//

_FileWriteDouble(_fstr+"_tp.dat", _tp);

//

Print("v128-2 > ", _Simbolo, " | ", _Lasso di tempo,

" -> ACQUISTA -> P1_sell=", P1_sell, " | P2_sell=", P2_sell, " | P3_sell=", P3_sell);

//

ticket = OrderSend(_Symbol, OP_SELL, _Lots0_1, ND(P1_sell), _Slippage, ND(P3_sell), ND(P2_sell),

NULL, _Magic1, 0, CLR_NONE);

se(biglietto == -1)

Print("v128-2 > ", _Simbolo, " | ", _Lasso di tempo,

" -> VENDI (1) > Errore (apertura) #", GetLastError());

altrimenti è_s1 = vero;

//

ticket = OrderSend(_Symbol, OP_SELL, _Lots0_2, ND(P1_sell), _Slippage, ND(P3_sell), 0,

NULL, _Magic2, 0, CLR_NONE);

se(biglietto == -1)

Print("v128-2 > ", _Simbolo, " | ", _Lasso di tempo,

" -> VENDI (2) > Errore (apertura) #", GetLastError());

altrimenti è_s2 = vero;

//

}

altrimenti { is_s1 = vero; is_s2 = vero; }

}

altrimenti { is_s1 = vero; is_s2 = vero; }

//Stampa("= vendi +++",è_b1,è_b2,"==",è_s1,è_s2);

// ===========

if(è_b1 && è_s1 && è_b2 && è_s2)

_TimePrevious=_TimeCurrent;

}

//

if(_IsTrailingStop)

{

if( !FindOrders(_Magic1) ) TrailingStop(_tp);

}

//

se(_IsStopLoss_0)

StopLoss_0(_StopLoss_0_Da);

//

ritorno(0);

}



//=++============================================== ======================= = =================++=

double DoubleTestZero(doppio valore, doppio nuovo_valore)

{

if(valore==0) return(valore);

altrimenti ritorno(nuovo_valore);

}



//=++============================================== ======================= = =================++=

doppio ND(doppio valore)

{

return( NormalizeDouble(valore, _Digits) );

}



//=++============================================== ======================= = =================++=

// ordini di chiusura. Fine su chiudi tutto

void OrdersDeleteAll(int cmd)

{

while(CountOrders(cmd) > 0)

{

for(int i = OrdersTotal() - 1; i >= 0 ; i--)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if( (OrderSymbol() == _Symbol)

&& (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2)

&& (TipoOrdine() == cmd) )

{

if(TipoOrdine() == OP_ACQUISTA)

if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), _Slippage, CLR_NONE))

Print("v128-2 > ", _Symbol, " > ACQUISTA -> ticket=", OrderTicket(),

" -> Errore (chiusura) #", GetLastError());

if(TipoOrdine() == OP_VENDITA)

if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), _Slippage, CLR_NONE))

Print("v128-2 > ", _Symbol, " > SELL -> ticket=", OrderTicket(),

" -> Errore (chiusura) #", GetLastError());

}

}

}


}


// numero di ordini

}




//=++============================================== ======================= = =================++=

// contando il numero di ordini nella direzione

int CountOrders(int cmd)

{

int n = 0;

for(int i = OrdersTotal() - 1; i >= 0 ; i--)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if( (OrderSymbol() == _Symbol)

&& (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2)

&& (TipoOrdine() == cmd) ) n++;

}

}

ritorno(n);

}



//=++============================================== ======================= = =================++=

// cerca un ordine per magia

bool FindOrders(int magic)

{

for(int i = OrdersTotal() - 1; i >= 0 ; i--)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == magic) )

ritorno(vero);

}

}

ritorno (falso);

}



//=++============================================== ======================= = =================++=

// risolvendo magicamente il livello di pareggio

void StopLoss_0(int da)

{

doppio punto di profitto, offerta, domanda;

bool è;

doppio P3_compra, P3_vendi;

//

for(int i = OrdersTotal() - 1; i >= 0 ; i--)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) )) continue;

//

if(TipoOrdine() == OP_ACQUISTA)

{

offerta = MarketInfo(_Simbolo, MODE_BID);

profitpoint = (offerta - OrderOpenPrice()) / _Point;

è = punto di profitto >= _StopLoss_0_Livello + da;

P3_buy = ND( OrderOpenPrice() + da * _Point);

//

if( è && ( OrderStopLoss() == 0 || OrderStopLoss() < P3_buy ) )

{

Print("v128-2 b4 >", _Simbolo, " | ", _Lasso di tempo,

" -> Bid=", MarketInfo(_Simbolo, MODE_BID),

" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_buy=", P3_buy,

" | d=", _StopLoss_0_Level, " | profitpoint=", profitpoint);

if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_buy, OrderTakeProfit(), 0, CLR_NONE))

Print("v128-2 b4 > ", _Simbolo, " | ", _Lasso di tempo,

" -> ACQUISTA > ticket=", OrderTicket(), " > Errore (pareggio) #", GetLastError());

}

}

//

altrimenti se(TipoOrdine() == OP_VENDITA)

{

chiedi = MarketInfo(_Simbolo, MODE_ASK);

profitpoint = (OrderOpenPrice() - chiedi) / _Point;

è = punto di profitto >= _StopLoss_0_Livello + da;

P3_sell = ND( OrderOpenPrice() - da * _Point);

//

if( è && ( OrderStopLoss() == 0 || OrderStopLoss() > P3_sell ) )

{

Print("v128-2 b4 >", _Simbolo, " | ", _Lasso di tempo,

" -> Chiedi =", MarketInfo(_Simbolo, MODE_ASK),

" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_sell=", P3_sell,

" | d=", _StopLoss_0_Level, " | profitpoint=", profitpoint);

if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_sell, OrderTakeProfit(), 0, CLR_NONE))

Print("v128-2 b4 > ", _Simbolo, " | ", _Lasso di tempo,

" -> VENDI -> ticket=", OrderTicket(), " > Errore (pareggio) #", GetLastError());

}

}

}

}

}



//=++============================================== ======================= = =================++=

// risolvendo il trailing stop con la magia

void TrailingStop(int da)

{

doppio punto di profitto, offerta, domanda;

doppio dal prezzo;

//

for(int i = OrdersTotal() - 1; i >= 0 ; i--)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) )) continue;

//

if(TipoOrdine() == OP_ACQUISTA)

{

if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() + from * _Point;

else fromprice = OrderStopLoss();

//

offerta = MarketInfo(_Simbolo, MODE_BID);

punto profitto = (offerta - ND(dal prezzo)) / _Punto;

//

if( punto di profitto >= _TrailingStopLevel &&

bid > (OrderStopLoss() + (_TrailingStopLevel + _TrailingStopStep) * _Point) )

{

Print("v128-2 v4 >", _Simbolo, " | ", _Lasso di tempo,

" -> Bid=", MarketInfo(_Simbolo, MODE_BID),

" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(),

" | d=", _TrailingStopLevel, " | profitpoint=", profitpoint);

if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(bid - (_TrailingStopLevel) * _Point),

OrderTakeProfit(), 0, CLR_NONE))

{

Print("v128-2 v4 >", _Simbolo, " | ", _Lasso di tempo,

" -> ACQUISTA > ticket=", OrderTicket(), " > Error (trailing stop) #", GetLastError());

}

}

}

//

altrimenti se(TipoOrdine() == OP_VENDITA)

{

if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() - da * _Point;

else fromprice = OrderStopLoss();

//

chiedi = MarketInfo(_Simbolo, MODE_ASK);

profitpoint = (ND(daprezzo) - chiedi) / _Punto;

//

if( punto di profitto >= _TrailingStopLevel &&

ask < (OrderStopLoss() - (_TrailingStopLevel + _TrailingStopStep) * _Point) )

{

Print("v128-2 v4 >", _Simbolo, " | ", _Lasso di tempo,

" -> Chiedi=", MarketInfo(_Simbolo, MODE_ASK),

" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(),

" | d=", _TrailingStopLevel, " | profitpoint=", profitpoint);

if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(ask + (_TrailingStopLevel) * _Point),

OrderTakeProfit(), 0, CLR_NONE))

{

Print("v128-2 v4 >", _Simbolo, " | ", _Lasso di tempo,

" -> VENDI > ticket=", OrderTicket(), " > Error (trailing stop) #", GetLastError());

}

}

}

}

}

}



//=++============================================== ======================= = =================++=

// Trovare il fondo locale. Restituisce il prezzo

double FindPriceMinMax(bool isUp)

{

spostamento int = 1;

doppio prezzo = 0, p0,p1,p2;

mentre(prezzo == 0)

{

p0 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 0, shift);

p1 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 1, shift);

p2 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 2, shift);

//Stampa("v128-2 >", _Simbolo, " | ", _Lasso di tempo,

// " > sift=", shift, " | p0=", p0, " | p1=", p1, " | p2=", p2);

se(isUp)

{

if(p0 !=0 && p0 == p1) // vertice trovato

prezzo = p0;

}

altro

{

if(p0 != 0 && p0 == p2) // fondo trovato

prezzo = p0;

}

spostamento++;

}

//Stampa("v128-2 >", _Simbolo, " | ", _Lasso di tempo,

// " -> ritorno(prezzo)=", prezzo);

ritorno(prezzo);

}



//================================================================================ = ======================

// Leggi la variabile dal file.

// Se il file non esiste, crea un file e scrivi la variabile nel file

double _FileReadWriteDouble(string filename, double value)

{

int h1 = FileOpen(nome file, FILE_BIN);

se(h1 > 0)

{

valore = FileReadDouble(h1, DOUBLE_VALUE);

FileChiudi(h1);

}

altro

{

h1 = FileOpen(nome file, FILE_BIN|FILE_WRITE);

FileWriteDouble(h1, valore, DOUBLE_VALUE);

FileChiudi(h1);

}

valore di ritorno);

}



//================================================================================ = ======================

// Scrive la variabile su file

void _FileWriteDouble(nome file stringa, valore doppio)

{

int h1 = FileOpen(nome file, FILE_BIN|FILE_WRITE);

FileWriteDouble(h1, valore, DOUBLE_VALUE);

FileChiudi(h1);

}