fez um 2 EMA cross EA, precisa de aconselhamento - página 3

 
deVries:


não se você testar com a propagação atual isto é muito louco, então a propagação pode se tornar muito grande.

Então, como você fez o teste ??

spread fixo ou spread atual ??


ok, então esta é a hora de eu ir ao Google "espalhar".

Agradeço que você esteja respondendo às minhas perguntas estúpidas))

Voltarei daqui a pouco

 
prupru:


ok, então esta é a hora de eu ir ao Google "espalhar".

Agradeço que você esteja respondendo às minhas perguntas estúpidas))

Voltarei daqui a pouco

Spread = Pergunte - Licite
 

e cada tick deste valor pode mudar

razão pela qual perguntei o método como você fez o teste

 
deVries:

e cada tick deste valor pode mudar

razão pela qual eu perguntei o método como você fez o teste

exatamente!

A diferença se deveu aos atuais testes de spread, quando eu realizei os testes com spread fixo eles eram exatamente os mesmos!

Muito obrigado a todos vocês!

Eu realmente melhorei meus conhecimentos.

E, por favor, me avisem se ainda há algo a ser melhorado no código.

 
prupru:

exatamente!

A diferença se deveu aos atuais testes de spread, quando eu realizei os testes com spread fixo eles eram exatamente os mesmos!

Muito obrigado a todos vocês!

Eu realmente melhorei meus conhecimentos.

E, por favor, me avisem se ainda há algo a ser melhorado no código.


se você mostrar o que seu código se tornou agora

Gostava de ver também um novo tratamento de erros, veja o comentário RaptorUK https://www.mql5.com/en/forum/148529

 
deVries:


se você mostrar o que seu código se tornou agora

como ver também um novo tratamento de erros, ver comentário RaptorUK https://www.mql5.com/en/forum/148529

Ok, aqui vamos nós:

#property copyright "me"
#property link      "killnosock.net"
extern int SlowEma = 21;
extern int FastEma = 10;
extern int MaxRisk = 100;// % of Depo to be traded per order
extern int  TakeProfit=0;
extern int  StopLoss=0;
extern int TrailingStop=0;
extern int Slippage = 10;

extern double MinDiff = 0.002;

int LastBars = 0;
//0 - undefined, 1 - bullish cross (fast MA above slow MA), -1 - bearish cross (fast MA below slow MA)
int PrevCross = 0;

int init(){return(0);}
int deinit() {return(0);}

normalização de preços:

double NormPrice(double g_price)
{
   return (NormalizeDouble(g_price,MarketInfo(Symbol(),MODE_DIGITS)));
}

Função GetLot, acho que não mudou

//function GetLot, get size of the lot according to MaxRisk
double GetLot(int Risk)
{double Free    =AccountFreeMargin();
 double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
 double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
 double Step    =MarketInfo(Symbol(),MODE_LOTSTEP);
 double Lot     =MathFloor(Free*Risk/100/One_Lot/Step)*Step;
 if(Lot<Min_Lot) Lot=Min_Lot;
 if(Lot>Max_Lot) Lot=Max_Lot;
 if(Lot*One_Lot>Free) {
 Alert(" free= ", AccountFreeMargin()," for one lot= ", MarketInfo(Symbol(),MODE_MARGINREQUIRED)," lot= ", Lot);
 return(0.0);}
return(Lot);}

Nova função de pedido, agora usa preços normalizados:

//function NewOrder, place new order
int NewOrder(int Cmd,double Lot)
{double TP=0; //тейкпрофит
 double SL=0; //стоплосс
 double PR=0; //Цена
 color clr = CLR_NONE;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(Cmd==OP_BUY)
   {PR=Ask;
    if(TakeProfit>0) TP=NormPrice(Ask + Ask*TakeProfit/100);
    if(StopLoss>0) SL=NormPrice(Ask - Ask*StopLoss/100);
    if(SL<0) SL = 0;
    if(TP<0) TP = 0;
    clr = Green;}
 if(Cmd==OP_SELL)
   {PR=Bid;
    if(TakeProfit>0) TP=NormPrice(Bid - Bid*TakeProfit/100);
    if(StopLoss>0) SL=NormPrice(Bid + Bid*StopLoss/100);
    if(SL<0) SL = 0;
    if(TP<0) TP = 0;
    clr=Red;}
 int tic=OrderSend(Symbol(),Cmd,Lot,PR,Slippage,SL,TP,"",0,0,clr);
 if(tic<0)
  {
   Print("open order error:",GetLastError());
   Print("cmd ", Cmd, " Lot ", Lot, " PR ", PR, " Slip ", Slippage, " SL ", SL, " TP ", TP, " Ask ", Ask, " Bid ", Bid);
  }
return(tic);}

Fechar 1 ou todos os pedidos

Eu não mudei a função de fechamento do pedido para verificar a existência de símbolos e números mágicos, porque vou negociar com apenas um símbolo e com apenas um EA por conta. Mas o farei depois de lidar com outras questões mais importantes e de ajuste.

//CloseOrder
void CloseOrder()
{double PR=0;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(OrderType()==OP_BUY)  PR=Bid;
 if(OrderType()==OP_SELL) PR=Ask;
 if(!OrderClose(OrderTicket(),OrderLots(),PR,Slippage,CLR_NONE))
  {
   Print("Close order error: ",GetLastError());
   Print("Type ", OrderType()," PR ",PR, " Ask ", Ask, " Bid ", Bid, " OrderTicket ", OrderTicket(), " OrderLots ", OrderLots());
  }
return;}
//--------------------------- end of close order

//Close all Orders
void CloseAllOrders()
{
  for(int i=OrdersTotal()-1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      CloseOrder();
     }
return;}

Mudei a detecção cruzada EMA de EmaDiff[2] para EmaDiff[1] para comparar EmaDiff[0] para zero e usar uma bandeira adicional (tudo isso vindo de algum exemplo que encontrei)

Em uma escala de minutos, a conta Demo faz disparos falsos quando o spread é tão alto que um negócio de compra faz com que os EMAs se cruzem e, em seguida, um negócio de venda que vem depois disso dentro da mesma barra de minutos faz com que eles se separem novamente.

[url=http://postimg.org/image/udq4ufmqf/][img]http://s15.postimg.org/udq4ufmqf/mess.jpg[/img][/url]

Estou pensando em como lidar com isso agora mesmo

// check cross
void CheckCross()
{
   double FMA_Current = iMA(Symbol(),0,FastEma,0,MODE_EMA,PRICE_CLOSE,0);
   double SMA_Current = iMA(Symbol(),0,SlowEma,0,MODE_EMA,PRICE_CLOSE,0);
   double Poin = (FMA_Current + SMA_Current)/2;
   double Lot;
   if (PrevCross == 0) //Was undefined
   {
      if ((FMA_Current - SMA_Current) >= MinDiff * Poin) PrevCross = 1; //Bullish state
      else if ((SMA_Current - FMA_Current) >= MinDiff * Poin) PrevCross = -1; //Bearish state
      return;
   }
   else if (PrevCross == 1) //Was bullish
   {
      if ((SMA_Current - FMA_Current) >= MinDiff * Poin) //Became bearish
      {
         CloseAllOrders();
         Lot = GetLot(MaxRisk);
         NewOrder(OP_SELL,Lot);
         PrevCross = -1;
      }
   }
   else if (PrevCross == -1) //Was bearish
   {
      if ((FMA_Current - SMA_Current) >= MinDiff * Poin) //Became bullish
      {
         CloseAllOrders();
         Lot = GetLot(MaxRisk);
         NewOrder(OP_BUY,Lot);
         PrevCross = 1;
      }
   }
}

a função de trailing stop:

// trailing stop
void DoTrailing()
{
   int total = OrdersTotal();
   for (int pos = 0; pos < total; pos++)
   {
      if (OrderSelect(pos, SELECT_BY_POS) == false) continue;
      if (OrderSymbol() == Symbol())
      {
         if (OrderType() == OP_BUY)
         {
            RefreshRates();
            if (Bid - OrderOpenPrice() >= TrailingStop * Bid/100) //If profit is greater or equal to the desired Trailing Stop value
            {
               if (OrderStopLoss() < (Bid - TrailingStop * Bid/100)) //If the current stop-loss is below the desired trailing stop level
                  OrderModify(OrderTicket(), OrderOpenPrice(), NormPrice(Bid - TrailingStop * Bid/100), OrderTakeProfit(), 0);
            }
         }
         else if (OrderType() == OP_SELL)
         {
            RefreshRates();
            if (OrderOpenPrice() - Ask >= TrailingStop * Ask/100) //If profit is greater or equal to the desired Trailing Stop value
            {
                      if ((OrderStopLoss() > (Ask + TrailingStop * Ask/100)) || (OrderStopLoss() == 0)) //If the current stop-loss is below the desired trailing stop level
                  OrderModify(OrderTicket(), OrderOpenPrice(), NormPrice(Ask + TrailingStop * Ask/100), OrderTakeProfit(), 0);
            }
         }
      }
   }   
}

e o próprio corpo:

//main program
int start()
  {

   if (TrailingStop > 0) DoTrailing();
          
        static datetime Time0;
        if (Time0 == Time[0]) return;
        Time0 = Time[0];
      {
       CheckCross();     
              
      }

   return(0);
  }

Obrigado por seu interesse!



 
prupru:


Eu não mudei a função de fechamento do pedido para verificar a existência de símbolos e números mágicos, porque vou negociar com apenas um símbolo e com apenas um EA por conta. Mas o farei depois de lidar com outras questões mais importantes e de ajuste.


não seja preguiçoso, faça-o diretamente !!!!

é uma coisa importante que você sempre tem que incluir

se você quiser consertar seu programa e nós damos conselhos sobre o que é necessário fazer

então se você não quer trabalhar para consertá-lo, então o que estamos fazendo para ajudá-lo ??

 
deVries:


não seja preguiçoso, faça-o diretamente !!!!

é uma coisa importante que você sempre tem que incluir

se você quiser consertar seu programa e nós damos conselhos sobre o que é necessário fazer

então se você não quer trabalhar para consertá-lo, então o que estamos fazendo para ajudá-lo ??


ok, ok, apenas vá com calma)

aqui está, acho que isso deve fazer o truque.

função de ordem aberta :

OrderSend(Symbol(),Cmd,Lot,PR,Slippage,SL,TP,"",Expert_ID,0,clr);

fechar toda a função de ordem:

//Close all Orders
void CloseAllOrders()
{
  for(int i=OrdersTotal()-1;i>=0;i--)
   {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == Expert_ID))  CloseOrder();
     }
    else
     {
      Print("Error selecting order: ",GetLastError());
      Print(" i= ", i, " Symbol= ", OrderSymbol());
     }
   }
return;}
 

Tenho um problema maior agora, meu corretor tende a executar parcialmente as ordens.

Prezado cliente,

Informamos que seu comércio foi aberto parcialmente (2,32 lotes em 15,84) ao preço de 587.318.

Caso você tenha alguma dúvida adicional sobre este assunto, não hesite em nos contatar.

Cordiais cumprimentos,

Corretor.

aqui está o que diz o apoio:

Favor ser avisado, durante períodos de alta volatilidade ou baixa liquidez, Ordens Limitadas podem ser parcialmente executadas. Isto significa que a posição será preenchida imediatamente, total ou parcialmente, se o preço for cumprido. No caso de sua ordem ter sido executada parcialmente, é por isso que você recebeu uma carta de notificação.

Eu entendo como fechar todas as ordens apesar de serem fechadas parcialmente, eu só tenho que fechar todas as ordens enquanto OrdensTotal() > 0, mas ainda não sei o que fazer quando as ordens abrem parcialmente.

editar:

Acabei de perceber que tenho que verificar os pedidos com símbolos e números mágicos adequados, é um pouco mais difícil

editar: aqui está a função fechar todas as ordens que devem fechar as ordens mesmo com fechamento parcial

//Close all my Orders
void CloseAllOrders()
{
int notMyOrders = 0;

for(int j=OrdersTotal()-1;j>=0;j--)
{
    if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES))
      {
       if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != Expert_ID)) notMyOrders++;
      }
    else
      {
       Print("Error selecting order: ",GetLastError());
       Print(" j= ", j, " Symbol= ", OrderSymbol());
      }    
}

 while (OrdersTotal()>notMyOrders)
 {
  for(int i=OrdersTotal()-1;i>=0;i--)
   {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == Expert_ID))  CloseOrder();
     }
    else
     {
      Print("Error selecting order: ",GetLastError());
      Print(" i= ", i, " Symbol= ", OrderSymbol());
     }
   }
 }


return;}
 

Eis como vou lutar contra a execução parcial de ordens em aberto,

A ordem de abertura não será mais realizada com uma função NewOrder, mas será feita com esta:

//OpenOrders in case of partial execution
int OpenPartOrders(int Cmd, double Lot)
{
 int NumOrders = 0;
 int LastTic = -1;
 double Step = MarketInfo(Symbol(),MODE_LOTSTEP);
 double LotRemains = Lot;
 
 //MathFloor( /Step)*Step;;
while (LotRemains>0)
 {
  LastTic = NewOrder(Cmd, LotRemains);
  NumOrders++;
  if(OrderSelect(LastTic, SELECT_BY_TICKET)==true)
     {
      LotRemains = LotRemains - OrderLots();
      Print("NumberOfOrders ", NumOrders, " Ticket ", LastTic, " LotRemains ", LotRemains, " initial Lot ", Lot);          
     }
  else
   {
    Print("OrderSelect returned the error of ",GetLastError());
    LotRemains = 0;//not to create an endless loop opening new orders again and again
   }
 } 
return(NumOrders);}