Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Olá, sou iniciante no Mql5, to querendo fazer algo bacana, mas aparentemente minhas funções não funcionam.
Ao longo do código abaixo eu uso todas as funções, então preciso ter certeza de que elas funcionam, compila perfeitamente, mas na hora dos testes, parece estar faltando algo.....
Segue o código:
#include <Trade\SymbolInfo.mqh>
input int qtdLotes = 5; //Quantidade de lotes
input double stLs = 4; //Stop Loss
input int peridoMovAvg = 60; //Periodo da média movel
input int desvioMovAvg = 2; //Desvio das bandas
input int peridoSixAvg = 30; //Periodo da média de seis
input long order_magic = 55555;
int handleMovAvg; //Handle para a media ponderada
int handleSixAvg; //Handle para a media de seis
CSymbolInfo simbolo;
int OnInit()
{
//---
//Verifica se o simbolo esta correto
if(!simbolo.Name(_Symbol)) {
printf("Ativo Inválido");
return INIT_FAILED;
}
//Insere ao handle a media movel
handleMovAvg = iCustom(_Symbol, _Period, "MediaMovel", peridoMovAvg);
//Insere ao handle a media de 6 reaproveitando o codigo da media movel, pois so variam os periodos
handleSixAvg = iCustom(_Symbol, _Period, "MediaMovel", peridoSixAvg);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
printf("Falha devida a: %s", reason);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick() {
//---
//Verifica se ha algum problema ao atualizar as cotações
if(!simbolo.RefreshRates())
return;
//AQUI VAI A LOGICA EM QUE EU USEI AS FUNÇÕES, OS DONOS DA LOGICA NAO ME PERMITIRAM EXPOR, MAS SÃO APENAS ALGUNS IFs e ELSEs, QUE UTILIZAM AS FUNCS.
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
}
//+------------------------------------------------------------------+
//| Trade function |
//+------------------------------------------------------------------+
void OnTrade()
{
//---
}
//+------------------------------------------------------------------+
bool PosicaoAberta() {
return PositionSelect(_Symbol);
}
void Fechar() {
if(checkVenda()){
Venda();
}else{
Compra();
}
}
void Compra() {
//--- preparar um pedido
MqlTradeRequest request={0};
request.action = TRADE_ACTION_DEAL;
request.type = ORDER_TYPE_BUY;
request.symbol = _Symbol;
request.volume = qtdLotes;
request.price=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
request.sl = request.price - stLs;
request.tp = 0;
//--- enviar um pedido de negociação
MqlTradeResult result={0};
OrderSend(request,result);
}
void Venda() {
//--- preparar um pedido
MqlTradeRequest request={0};
request.action = TRADE_ACTION_DEAL;
request.type = ORDER_TYPE_SELL;
request.symbol = _Symbol;
request.volume = qtdLotes;
request.price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
request.sl = request.price + stLs;
request.tp = 0;
//--- enviar um pedido de negociação
MqlTradeResult result={0};
OrderSend(request,result);
}
/*
Todas as funções de check:
Armazenam as ultimas duas posições em um array temporario, da média móvel ou da média de seis conforme o caso de uso.
Verificam se as ofertas de compra e venda tocaram as medias ou alguma banda e retorna conforme o caso de uso.
*/
bool checkVenda(){
//Insere o retorno de PositionSelect para tipo, trazendo o tipo de operação que foi realizada
ENUM_POSITION_TYPE tipo=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
//Verifica se o tipo é venda e retorna true caso sim e false caso não seja, caracterizando uma compra
if(tipo == POSITION_TYPE_SELL){
return true;
}else{
return false;
}
}
bool checkBandaCima(){
double MediaArray[];
ArraySetAsSeries(MediaArray, true);
CopyBuffer(handleMovAvg, 0, 0, 2, MediaArray);
if(SYMBOL_ASK >= (MediaArray[0] + desvioMovAvg)){
return true;
}else{
return false;
}
}
bool checkBandaBaixo(){
double MediaArray[];
ArraySetAsSeries(MediaArray, true);
CopyBuffer(handleMovAvg, 0, 0, 2, MediaArray);
if(SYMBOL_BID <= (MediaArray[0] - desvioMovAvg)){
return true;
}else{
return false;
}
}
bool checkSixCompra(){
double Media6Array[];
ArraySetAsSeries(Media6Array, true);
CopyBuffer(handleSixAvg, 0, 0, 2, Media6Array);
if(SYMBOL_ASK <= Media6Array[0]){
return true;
}else{
return false;
}
}
bool checkSixVenda(){
double Media6Array[];
ArraySetAsSeries(Media6Array, true);
CopyBuffer(handleSixAvg, 0, 0, 2, Media6Array);
if(SYMBOL_BID >= Media6Array[0]){
return true;
}else{
return false;
}
}