Por favor, ajude a escrever EAs de graça. 5 idéias diferentes. - página 15

 

É isso aí. Estou vendo. "Tentando" ajudar. Sinto que está na hora de compartilhar mais algumas idéias.

 
GeneratorID:

É isso aí. Estou vendo. "Tentando" ajudar. Sinto que está na hora de compartilhar mais algumas idéias.


Quem estaria interessado na "bicicleta velha"? Você ainda não entendeu que o que você está tentando começar a explorar já se foi há muito tempo no fórum e há implementações livres na base de código - olhe e brinque por aí. Você tem suas próprias idéias? Caso contrário, não há nada a discutir.
 

Por favor, ajude-me a adicionar o número máximo de pedidos abertos ao consultor!

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

//| v128-2.mq4 |

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

//| 21/03/2011 |

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

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

#property copyright "Copyright © 2011, Andrey N. Bolkonsky"

#link da propriedade "abolk@yandex.ru"


//

extern string rem2 = "=== Número de lotes ===";

externo duplo _Lots0_1 = 0,1; // Nível base (para o 1º pedido)

externo duplo _Lots0_2 = 0,1; // Nível base (para a 2ª ordem)

//

extern string rem3 = "=== Parâmetros adicionais ===";

externo int _TakeProfit1_Proc = 50; // Percentual de risco para obter lucro da 1ª ordem

externo int _SpaseFromMaxMin = 1; // Deslocamento de cima/baixo

//

extern string rem4 = "=== Parâmetros de equilíbrio ===";

extern bool _IsStopLoss_0 = false; // Habilitando o uso do nível de equilíbrio

externo int _StopLoss_0_From = 0; // Deslocamento do nível de equilíbrio (em pontos)

externo int _StopLoss_0_Level = 15; //Nível de equilíbrio

//

extern string rem5 = "=== Parâmetros de parada final ===";

extern bool _IsTrailingStop = false; // Ativa o trailing stop

bool _IsTrailingStopProfit = true; // Habilitando um trailing stop a partir de uma posição de equilíbrio

//extern int _TrailingStopProfit_From = 0; // Deslocamento do nível de equilíbrio (em pontos)

extern int _TrailingStopLevel = 15; // Nível de trailing stop

extern int _TrailingStopStep = 5; // Passo de movimento do trailing stop

//

extern string rem6 = "=== Configurações da ferramenta ===";

string externa _Symboll = ""; // Nome simbólico do instrumento: "" - símbolo atual

extern int _Timeframe = 0; // Período: 0 - período do gráfico atual

int_Digitss; // Número de dígitos após o ponto decimal no preço

double _Points; // Tamanho do ponto na moeda da cotação

extern int _Slippage = 2; // derrapagem

externo int _Magic1 = 1281; // Número único de pedidos do EA (1º pedido)

externo int _Magic2 = 1282; // Número único de pedidos do EA (2º pedido)

//

extern string rem7 = "=== parâmetros do indicador MA1 ===";

externo int _MA1_Timeframe = PERIOD_D1; // Período: 0 - período do gráfico atual

externo int _MA1_Period = 20; // Período médio para calcular a média móvel

externo int _MA1_Shift = 0; // Deslocamento do indicador em relação ao gráfico de preços

externo int _MA1_Method = 0; // Método de média: 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA

extern int _MA1_Applied_Price = 0; // Preço usado: 0 - fechar, 1 - abrir, 2 - alto, 3 - baixo

//

extern string rem8 = "=== parâmetros do indicador MA2 ===";

externo int _MA2_Timeframe = PERIOD_H4; // Período: 0 - período do gráfico atual

externo int _MA2_Period = 20; // Período médio para calcular a média móvel

externo int _MA2_Shift = 0; // Deslocamento do indicador em relação ao gráfico de preços

externo int _MA2_Method = 0; // Método de média: 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA

extern int _MA2_Applied_Price = 0; // Preço usado: 0 - fechar, 1 - abrir, 2 - alto, 3 - baixo

//

extern string rem9 = "=== Parâmetros do indicador Bollinger Bands ===";

//extern int _BB_Timeframe = 0; // Período: 0 - período do gráfico atual

externo int _BB_Period = 20; // Período médio da linha do indicador principal

externo int _BB_Desvio = 2; // Desvio da linha principal

externo int _BB_Bands_Shift = 0; // Deslocamento do indicador em relação ao gráfico de preços

extern int _BB_Applied_Price = 0; // Preço usado: 0 - fechar

//

extern string rem10 = "=== Parâmetros do indicador ZigZag ===";

//extern int _ZZ_Timeframe = 0; // Período: 0 - período do gráfico atual

externo int _ZZ_ExtDepth = 12;

externo int _ZZ_ExtDeviation = 5;

externo int _ZZ_ExtBackstep = 3;

//

datetime_TimeAnterior;

datetime _TimeCurrent;

//

string_fstr;

int_tp;

//




void MaxOrders(int max_orders=5);











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

int init()

{

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

//

_Digitss = MarketInfo(_Symbol, MODE_DIGITS);

_Points = MarketInfo(_Symbol, MODE_POINT);

//

if(_Timeframe == 0) _Timeframe = Period();

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

"rem4=",_IsStopLoss_0,

"rem5=",_IsTrailingStop,_IsTrailingStopProfit);

//

_fstr = "v128_";

_tp = _FileReadWriteDouble(_fstr+"_tp.dat", 0); // verifique se o arquivo existe, se não existir, crie-o

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

//

_TimePrevious=iTime(_Symbol, _Timeframe, 0);

//

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

retorno(0);

}



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

int start()

{

duplo P_Close1, P_Close2;

duplo BB_1_superior, BB_1_inferior;

duplo MA1_0, MA2_0;

double P_ask, P_bid;

bool is_signal_2_buy, is_signal_2_sell;

duplo P1_comprar, P2_comprar, P3_comprar;

duplo P1_sell, P2_sell, P3_sell;

bool is_b1 = falso, is_s1 = falso;

bool is_b2 = falso, is_s2 = falso;

bilhete interno;

//

_TimeCurrent = iTime(_Symbol, _Timeframe, 0);

if(_TimeCurrent != _TimePrevious)

{

MA1_0 = iMA(_Symbol, _MA1_Timeframe, _MA1_Period, _MA1_Shift, _MA1_Method, _MA1_Applied_Price, 0);

MA2_0 = iMA(_Symbol, _MA2_Timeframe, _MA2_Period, _MA2_Shift, _MA2_Method, _MA2_Applied_Price, 0);

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

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

P_Close1 = iClose(_Symbol, _Timeframe, 1);

P_Close2 = iClose(_Symbol, _Timeframe, 2);

P_ask = MarketInfo(_Symbol, MODE_ASK);

P_bid = MarketInfo(_Symbol, MODE_BID);

Print("v120-4 > ", _Symbol, " | ", _Timeframe,

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

" -> BB_1_superior=", BB_1_superior, " | BB_1_inferior=", BB_1_inferior,

" -> P_Close1=", P_Close1, " | P_Close2=", P_Close2,

" -> pedir=", P_pedir, " | lance=", 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 > ", _Symbol, " | ", _Timeframe,

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

// ========== por mercado

// ========== abrindo uma ordem de COMPRA

if( is_signal_2_buy )

{

Print("v128-2 > ", _Symbol, " | ", _Timeframe,

" -> sinal para abrir uma ordem de COMPRA");

OrdersDeleteAll(OP_SELL);

//

if(!is_b1 || !is_b2)

{

P1_comprar = P_pedir;

P3_buy = FindPriceMinMax(false) - (_SpaseFromMaxMin) * _Point;

_tp = (P1_compra - P3_compra) / _Ponto * (_TakeProfit1_Proc / 100,0);

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

//

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

//

Print("v128-2 > ", _Symbol, " | ", _Timeframe,

" -> COMPRAR -> P1_comprar=", P1_comprar, " | P2_comprar=", P2_comprar, " | P3_comprar=", P3_comprar, "_tp=", _tp);

//

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

NULL, _Magic1, 0, CLR_NONE);

if(ticket == -1)

Print("v128-2 > ", _Symbol, " | ", _Timeframe,

" -> COMPRAR (1) > Erro (abertura) #", GetLastError());

senão é_b1 = verdadeiro;

//

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

NULL, _Magic2, 0, CLR_NONE);

if(ticket == -1)

Print("v128-2 > ", _Symbol, " | ", _Timeframe,

" -> COMPRAR (2) > Erro (abertura) #", GetLastError());

senão é_b2 = true;

//

}

else { is_b1 = true; is_b2 = verdadeiro; }

}

else { is_b1 = true; is_b2 = verdadeiro; }

//Print("= comprar +++",is_b1,is_b2,"==",is_s1,is_s2);

// ========== abrindo uma ordem de VENDA

if( is_signal_2_sell )

{

Print("v128-2 > ", _Symbol, " | ", _Timeframe,

" -> sinal para abrir uma ordem de VENDA");

OrdersDeleteAll(OP_BUY);

//

if(!is_s1 || !is_s2)

{

P1_venda = P_lance;

P3_sell = FindPriceMinMax(true) + (_SpaseFromMaxMin) * _Point;

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

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

//

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

//

Print("v128-2 > ", _Symbol, " | ", _Timeframe,

" -> COMPRAR -> 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);

if(ticket == -1)

Print("v128-2 > ", _Symbol, " | ", _Timeframe,

" -> VENDER (1) > Erro (abertura) #", GetLastError());

senão é_s1 = true;

//

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

NULL, _Magic2, 0, CLR_NONE);

if(ticket == -1)

Print("v128-2 > ", _Symbol, " | ", _Timeframe,

" -> VENDER (2) > Erro (abertura) #", GetLastError());

senão é_s2 = true;

//

}

else { is_s1 = true; is_s2 = verdadeiro; }

}

else { is_s1 = true; is_s2 = verdadeiro; }

//Print("= vender +++",is_b1,is_b2,"==",is_s1,is_s2);

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

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

_TimePrevious=_TimeCurrent;

}

//

if(_IsTrailingStop)

{

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

}

//

if(_IsStopLoss_0)

StopLoss_0(_StopLoss_0_From);

//

retorno(0);

}



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

double DoubleTestZero(double value, double new_value)

{

if(valor==0) return(valor);

senão return(novo_valor);

}



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

ND duplo (valor duplo)

{

return( NormalizeDouble(valor, _Digits) );

}



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

// fechando pedidos. Terminar em fechar tudo

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)

&& (OrderType() == cmd))

{

if(OrderType() == OP_BUY)

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

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

" -> Erro (fechamento) #", GetLastError());

if(OrderType() == OP_SELL)

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

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

" -> Erro (fechamento) #", GetLastError());

}

}

}


}


// número de pedidos

}




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

// contando o número de pedidos na direção

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)

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

}

}

retorno(n);

}



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

// busca por um pedido por mágica

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

retorno(verdadeiro);

}

}

retorna falso);

}



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

// calculando o nível de equilíbrio por mágica

void StopLoss_0(int de)

{

ponto de lucro duplo, lance, peça;

bool é;

duplo P3_comprar, P3_vender;

//

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(OrderType() == OP_BUY)

{

oferta = MarketInfo(_Symbol, MODE_BID);

ponto de lucro = (lance - OrderOpenPrice()) / _Point;

é = ponto de lucro >= _StopLoss_0_Level + from;

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

//

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

{

Print("v128-2 b4 >", _Symbol, " | ", _Timeframe,

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

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

" | d=", _StopLoss_0_Level, " | ponto de lucro=", ponto de lucro);

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

Print("v128-2 b4 > ", _Symbol, " | ", _Timeframe,

" -> BUY > ticket=", OrderTicket(), " > Error (breakeven) #", GetLastError());

}

}

//

senão if(OrderType() == OP_SELL)

{

perguntar = MarketInfo(_Symbol, MODE_ASK);

ponto de lucro = (OrderOpenPrice() - perguntar) / _Point;

é = ponto de lucro >= _StopLoss_0_Level + from;

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

//

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

{

Print("v128-2 b4 >", _Symbol, " | ", _Timeframe,

" -> Pergunte =", MarketInfo(_Symbol, MODE_ASK),

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

" | d=", _StopLoss_0_Level, " | ponto de lucro=", ponto de lucro);

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

Print("v128-2 b4 > ", _Symbol, " | ", _Timeframe,

" -> SELL -> ticket=", OrderTicket(), " > Error (breakeven) #", GetLastError());

}

}

}

}

}



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

// calculando o trailing stop por mágica

void TrailingStop(int from)

{

ponto de lucro duplo, lance, peça;

dobro do preço;

//

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(OrderType() == OP_BUY)

{

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

else fromprice = OrderStopLoss();

//

oferta = MarketInfo(_Symbol, MODE_BID);

ponto de lucro = (lance - ND(do preço)) / _Ponto;

//

if( ponto de lucro >= _TrailingStopLevel &&

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

{

Print("v128-2 v4 >", _Symbol, " | ", _Timeframe,

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

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

" | d=", _TrailingStopLevel, " | ponto de lucro=", ponto de lucro);

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

OrderTakeProfit(), 0, CLR_NONE))

{

Print("v128-2 v4 >", _Symbol, " | ", _Timeframe,

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

}

}

}

//

senão if(OrderType() == OP_SELL)

{

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

else fromprice = OrderStopLoss();

//

perguntar = MarketInfo(_Symbol, MODE_ASK);

ponto de lucro = (ND(fromprice) - pedir) / _Point;

//

if( ponto de lucro >= _TrailingStopLevel &&

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

{

Print("v128-2 v4 >", _Symbol, " | ", _Timeframe,

" -> Ask=", MarketInfo(_Symbol, MODE_ASK),

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

" | d=", _TrailingStopLevel, " | ponto de lucro=", ponto de lucro);

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

OrderTakeProfit(), 0, CLR_NONE))

{

Print("v128-2 v4 >", _Symbol, " | ", _Timeframe,

" -> VENDER > ticket=", OrderTicket(), " > Erro (trailing stop) #", GetLastError());

}

}

}

}

}

}



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

// Encontrando o fundo local. Retorna o preço

double FindPriceMinMax(bool isUp)

{

int deslocamento = 1;

preço duplo = 0, p0,p1,p2;

while(preço == 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);

//Print("v128-2 >", _Symbol, " | ", _Timeframe,

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

if(isUp)

{

if(p0 !=0 && p0 == p1) // vértice encontrado

preço = p0;

}

senão

{

if(p0 != 0 && p0 == p2) // fundo encontrado

preço = p0;

}

deslocamento++;

}

//Print("v128-2 >", _Symbol, " | ", _Timeframe,

// " -> return(preço)=", preço);

retorno(preço);

}



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

// Lê a variável do arquivo.

// Se o arquivo não existir, cria um arquivo e grava a variável no arquivo

double _FileReadWriteDouble(string nome do arquivo, valor duplo)

{

int h1 = FileOpen(nome do arquivo, FILE_BIN);

if(h1 > 0)

{

valor = FileReadDouble(h1, DOUBLE_VALUE);

FileClose(h1);

}

senão

{

h1 = FileOpen(nome do arquivo, FILE_BIN|FILE_WRITE);

FileWriteDouble(h1, valor, DOUBLE_VALUE);

FileClose(h1);

}

valor de retorno);

}



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

// Escreve a variável no arquivo

void _FileWriteDouble(string nome do arquivo, valor duplo)

{

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

FileWriteDouble(h1, valor, DOUBLE_VALUE);

FileClose(h1);

}