Funcionamento das funções

 

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;

   }

}

Razão: