[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 706

 

estava criando indicadores de seta. Se Deus quiser, eu criei alguns, aprendi uma coisa ou duas. Agora decidi combiná-los, para fazer dois em um ....... A essência da idéia: ter MACD, estabelecer certos níveis nos níveis + e -. Quando MACD estiver atrás desses níveis (tanto em + quanto em -), então aparecerão flechas de compra e venda. Parece ser feito, compila sem erros MAS MAS não funciona assim tão bem não....

//+------------------------------------------------------------------+
//|                                               Indicator_MACD.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
// Modify Vinin
#property copyright ""
#property link      ""

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
//---- input parameters
extern int       Fast_EMA=8;
extern int       Slow_EMA=34;
extern double    N = 0.0015;
extern int       A = 10;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double MACD[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(0,218);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(1,217);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   SetIndexBuffer(2,MACD);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit = Bars-counted_bars-1;
   
   for(int i = limit; i>= 0; i--) {
      ExtMapBuffer2[i] = EMPTY;
      ExtMapBuffer1[i] = EMPTY;
      MACD[i]=iMACD(NULL,0,Fast_EMA,Slow_EMA,1,1,MODE_MAIN, i);
      if ((MACD[i]>MACD[i+1]) || (MACD[i]<MACD[i+1]))
      {
       if( MACD[i] <-N) ExtMapBuffer2[i] = Low[i]-A*Point;
       if( MACD[i] > N) ExtMapBuffer1[i] = High[i]+A*Point; 
      }
   }
   return(0);
}
//+------------------------------------------------------------------+ 

este é um indicador de funcionamento

 

E isto é o que eu tenho.......

//+------------------------------------------------------------------+
//|                                           ndicator_MACD_OsMA.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
// Modify Vinin
#property copyright ""
#property link      ""

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
//---- input parameters
extern int       F_EMA=8;      // пар-ры MACD
extern int       S_EMA=34;     // пар-ры MACD
extern double    N = 0.0015;   // контр. линия
extern int       A = 10;       // расстояние от бара
extern int       Fast_EMA=12;  // пар-ры OsMA
extern int       Slow_EMA=26;  // пар-ры OsMA
extern int       Signal_EMA=9; // пар-ры OsMA
extern double    Z = 0.00005;  // контр. линия
extern int       B = 10;       // расстояние от бара

//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double MACD[];
double OsMA[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(0,218);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(1,217);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   SetIndexBuffer(2,MACD);
   SetIndexBuffer(2,OsMA);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit = Bars-counted_bars-1;
   
   for(int i = limit; i>= 0; i--) {
      ExtMapBuffer2[i] = EMPTY;
      ExtMapBuffer1[i] = EMPTY;
      MACD[i]=iMACD(NULL,0,F_EMA,S_EMA,1,1,MODE_MAIN, i);
      OsMA[i]=iOsMA(NULL,0,Fast_EMA,Slow_EMA,Signal_EMA,PRICE_OPEN,i);
      if (((MACD[i]>MACD[i+1])||(MACD[i]<MACD[i+1]))&&((OsMA[i]>OsMA[i+1])||(OsMA[i]<OsMA[i+1])))
      {
       if( MACD[i] <-N) ExtMapBuffer2[i] = Low[i]-A*Point;
       if( MACD[i] > N) ExtMapBuffer1[i] = High[i]+A*Point;
       if( OsMA[i] <-Z) ExtMapBuffer2[i] = Low[i] -B*Point;
       if( OsMA[i] > Z) ExtMapBuffer1[i] = High[i]+B*Point; 
      }
   }
   return(0);
}
//+------------------------------------------------------------------+ 

Sinto que algo está errado no código e não entendo o que é............................. AJUDE OS ERRADOS..... :-))

 
Por que os pares mais básicos não estão : EUR/USD, USD/JPY no Arquivo de Citações? Talvez eu esteja fazendo algo errado?
 

Olá! Obrigado à Artem pelas funções da KimIV.

Talvez alguém saiba: uma das funções TakeProfitLastClosePos() (retorna o preço TakeProfit da última posição fechada ou -1), retorna o valor TakeProfit com quatro casas decimais, e meu CD dá cinco casas decimais (par EURUSD). Não posso fazer o próximo pedido, pois o valor TakeProfit da última posição fechada e o preço para fazer o próximo pedido estão diretamente relacionados um com o outro.Você pode me ajudar a sair desta situação? Obrigado de antemão!!!

double TakeProfitLastClosePos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   r=-1;
  int      i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                r=OrderTakeProfit();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
 
dimon74:

Olá! Obrigado à Artem pelas funções da KimIV.

Talvez alguém saiba: uma das funções TakeProfitLastClosePos() (retorna o preço TakeProfit da última posição fechada ou -1), retorna o valor TakeProfit com quatro casas decimais, e meu CD dá cinco casas decimais (par EURUSD). Não posso fazer o próximo pedido, pois o valor TakeProfit da última posição fechada e o preço para fazer o próximo pedido estão diretamente relacionados um com o outro.Você pode me ajudar a sair desta situação? Obrigado de antemão!!!


Na verdade, a função retorna um valor com todos os dígitos significativos após o ponto decimal. Mesmo oito casas decimais. É só que a saída padrão é de 4 dígitos. Mas se você usa DoubleToStr() com antecedência, você pode ter certeza
 
drknn:
OrderSend(Nome do par de moedas.... e outros parâmetros......)


Preciso de ajuda para resolver o código para EA com várias moedas, preciso de um EA para trabalhar e negociar para ser aberto em qualquer par de moedas.

Cavei EA com várias moedas em CodeBase, mas não consigo entender o que está onde e por quê.

Se você não entender o código da EA com várias moedas, você não poderá verificá-lo no Testador de Estratégia (( Por favor, explique-me, com base neste código ou em algum outro código, o que deve ir para onde e por quê, para que minha EA negocie em todos os pares. Eu não entendo, mas se eu cortar o código sem entendê-lo, ele funcionará, mas ainda não entendo a implementação, e terei que pedir ajuda novamente.

extern string Instrument = "EURUSD";
extern double Lots = 0.1;
extern int    TakeProfit = 50;
extern int    TrailingStop = 0;
extern int    StopLoss = 50;
extern int    FirstOpenLevel = 5;
extern int    LastOpenLevel = 20;
extern int    Slope = 2;
extern int    CloseLevel = 20;
 

int start()
{
   double MacdCurrent, MacdPrevious, SignalCurrent, SignalPrevious;
   int    i, total, p1, p2, p3, p4, p5, p6, p7, p8, p9;
  
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
      
   p1=0; p2=0; p3=0; p4=0; p5=0; p6=0; p7=0; p8=0; p9=0;
      
     OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
      
     OrderSelect(1,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(2,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(3,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(4,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
   
   total=OrdersTotal();
   for(i=0;i<total;i++)
   {
     OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        
     if(OrderSymbol()==Instrument)
      {
         if(OrderType()==OP_BUY) 
          {
            if(MacdPrevious-SignalPrevious-MacdCurrent+SignalCurrent>CloseLevel*0.1*Point)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
                 return(0);
                }
            if(TrailingStop>0)  
              {      
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop || OrderStopLoss()==0)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
          if(OrderType()==OP_SELL)
           {
            if(SignalPrevious-MacdPrevious-SignalCurrent+MacdCurrent>CloseLevel*0.1*Point)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
               return(0);
              }
            if(TrailingStop>0)  
              {         
               if(OrderOpenPrice()-Ask>Point*TrailingStop)
                 {
                  if(OrderStopLoss()>Ask+Point*TrailingStop || OrderStopLoss()==0)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   
   total=OrdersTotal();  
   if(total<5)
   {
     if((Instrument=="EURUSD" && p1<1) || (Instrument=="GBPUSD" && p2<1) || 
        (Instrument=="USDCHF" && p3<1) || (Instrument=="USDJPY" && p4<1) ||
        (Instrument=="EURCHF" && p5<1) || (Instrument=="EURGBP" && p6<1) ||
        (Instrument=="AUDUSD" && p7<1) || (Instrument=="USDCAD" && p8<1) ||
        (Instrument=="EURJPY" && p9<1)) 
      {
        if(MacdCurrent<0 && MacdCurrent-SignalCurrent>SignalCurrent*FirstOpenLevel*(-0.01)
           && MacdCurrent-SignalCurrent<SignalCurrent*LastOpenLevel*(-0.01)
           && MacdCurrent-MacdPrevious>MacdPrevious*Slope*(-0.01)
           && MacdPrevious-SignalPrevious-MacdCurrent+SignalCurrent<(CloseLevel-10)*0.1*Point)  
          {
           OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",0,0,Green);
           return(0); 
          }   
      
         if(MacdCurrent>0 && SignalCurrent-MacdCurrent>SignalCurrent*FirstOpenLevel*0.01
            && SignalCurrent-MacdCurrent<SignalCurrent*LastOpenLevel*0.01
            && MacdPrevious-MacdCurrent>MacdPrevious*Slope*0.01
            && SignalPrevious-MacdPrevious-SignalCurrent+MacdCurrent<(CloseLevel-10)*0.1*Point)
          {
           OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",0,0,Red);
           return(0); 
          }
       }
    }
}
 
igrok2008:

E isto é o que eu tenho.......
Cheira-me a algo errado no código e não sei o que é................

Você adicionou um quarto conjunto de indicadores, mas ainda tem três em seu código, abaixo está o código tweaked:
int init(){
//---- indicators
   IndicatorBuffers(4);   
   SetIndexStyle(0,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(0,218);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);   
   SetIndexStyle(1,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(1,217);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);   
   SetIndexBuffer(2,MACD);
   SetIndexBuffer(3,OsMA);   
//----
}
 
Infinity:
Preciso de ajuda para entender o código para EA com várias moedas.

Eu cavei uma EA com várias moedas em CodeBase, mas não consigo descobrir onde e por quê.
Se você não entender o código, não poderá verificá-lo no Testador de Estratégia (( Por favor, explique-me, com base neste código ou em algum outro código, o que deve ir para onde e por quê, para que minha EA possa negociar em todos os pares. Não entendo o código, mas ele pode funcionar, mas ainda não entendo a implementação, e terei que pedir ajuda novamente.

Este código não se ajusta a você, pois abre transações somente no par, ao qual está anexado, ele pode ser visto nas linhas:

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",0,0,Green);
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",0,0,Red);

Símbolo de função () retorna o par atual. Assim, para abrir em outros pares de moedas, em vez desta função, simplesmente digite o nome desejado do instrumento financeiro.

 
ToLik_SRGV:

Este código não lhe convém, pois ele só abre negócios no par ao qual está anexado, isto pode ser visto nas linhas:

Símbolo de função () retorna o par atual. Assim, para abrir negócios em outros pares de moedas, ao invés desta função, basta digitar o nome do instrumento financeiro de que você precisa.


Não é tão fácil assim. Você também precisa mudar o Ponto para o valor correto, e Pergunte. E Licite também.
 
ToLik_SRGV:

Este código não lhe convém, pois ele só abre negócios no par ao qual está anexado, isto pode ser visto nas linhas:

Símbolo de função () retorna o par atual. Assim, para abrir negócios em outros pares de moedas, ao invés desta função, basta digitar o nome do instrumento financeiro de que você precisa.


A questão é essa. Meu Expert Advisor recebe sinais de diferentes pares de moedas e em vez da função Symbol(), recebe o nome da moeda de onde o sinal foi recebido e em vez de uma variável na ordem, que é atribuída ao valor do par de moedas. Isso significa que se o sinal vem do EUR, é atribuído o EURUSD se vem do iene, então USDJPY mas o EA vê todos os sinais, mas abre apenas a moeda em que se encontra.

É assim que eu faço o seguinte código de amostra

//---- ранее на обработке переменная Symb получает значение валютной пары с которой пришол сигнал
// далее я сравниваю и пытаюсь открыть ордер
 if (Symb == "GBPUSD") {val ="GBPUSD"; ticket=OrderSend(val,OP_BUY,0.1,Ask,3,Bid-20*Point,Ask+25*Point,"",16384,0,Green);}
 if (Symb == "EURUSD") {val ="EURUSD"; ticket=OrderSend(val,OP_BUY,0.1,Ask,3,Bid-20*Point,Ask+25*Point,"",16384,0,Green);}
 if (Symb == "USDJPY") {val ="USDJPY"; ticket=OrderSend(val,OP_BUY,0.1,Ask,3,Bid-20*Point,Ask+25*Point,"",16384,0,Green);}
Razão: