[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 485

 
No SL, a EA deve abrir uma ordem do mesmo tipo e no TP do tipo oposto!
Mas por alguma razão a EA frequentemente abre uma ordem do tipo errado!



//+------------------------------------------------------------------+
//|                                                      Kogalym.mq4 |
//|                                                               TO |
//|                             http://forex-tradexperts-to.narod.ru |
//+------------------------------------------------------------------+
#property copyright "TO"
#property link      "http://forex-tradexperts-to.narod.ru"

//--------------------------------------------------------------------
extern int  stoploss    = 50,
            takeprofit  = 50;
extern double      Lot=1;
extern double Martin_Koef = 1.6;
//--------------------------------------------------------------------
int init()
{
   OrderSend(Symbol(),OP_SELL,Lot,Bid,3,NormalizeDouble(Ask + stoploss*Point,Digits),
                        NormalizeDouble(Bid - takeprofit*Point,Digits)," ",777,Blue);
}
//--------------------------------------------------------------------
int start()
{   for (int i=0; i<OrdersTotal(); i++){   
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true){
         if (OrderSymbol()==Symbol()){
         Lot = OrderLots();return;}}}
            if (Lot==0) return;
       
  if(OrderType() == OP_SELL)
   if(OrderProfit()>0) OrderSend(Symbol(),OP_BUY , getLot(),Ask,3,NormalizeDouble(Bid - stoploss*Point,Digits),
                                    NormalizeDouble(Ask + takeprofit*Point,Digits)," ",777,Blue); 
 else  OrderSend(Symbol(),OP_SELL,getLot(),Bid,3,NormalizeDouble(Ask + stoploss*Point,Digits),
                                   NormalizeDouble(Bid - takeprofit*Point,Digits)," ",777,Blue);

  if(OrderType() == OP_BUY) 
   if(OrderProfit()>0)OrderSend(Symbol(),OP_SELL,getLot(),Bid,3,NormalizeDouble(Ask + stoploss*Point,Digits),
        NormalizeDouble(Bid - takeprofit*Point,Digits)," ",777,Blue);
else  OrderSend(Symbol(),OP_BUY ,getLot(),Ask,3,NormalizeDouble(Bid - stoploss*Point,Digits),
                                    NormalizeDouble(Ask + takeprofit*Point,Digits)," ",777,Blue);
  
                                     
       
   return(0);
}
//-----------------------------------------------------------------

double getLot()
{
   if(OrdersHistoryTotal()==0)return(1);
   // ищем самый последний закрытый ордер
   datetime time=0;
   int i;
   int ticket=-1;
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      {
         if(OrderSymbol()==Symbol())
         {
            if(OrderCloseTime()>time)
            {
               time=OrderCloseTime();
               ticket=OrderTicket();
            }
         }
      }
   }
   if(OrderTicket()!=ticket)OrderSelect(ticket,SELECT_BY_TICKET);
   if(OrderProfit()<=0) return(NormalizeDouble(OrderLots()*Martin_Koef,2));
   if(OrderProfit()>0)return(1);
   //-----
}
Por favor, diga-me onde há um erro!
 
Kogalym писал(а) >>
No SL a EA deve abrir uma ordem do mesmo tipo e no TP do tipo oposto!
Mas por alguma razão a EA muitas vezes abre a ordem do tipo errado!



Você pode me dizer onde está o erro?

if(OrderType() == OP_SELL)
   if(OrderProfit()>0)
É para isto que serve a seleção.
 
Quem sabe se este indicador é adequado para uma EA, encontrei uma estratégia onde ele é aplicado pelo autor, pode ser escrito na EA e como fazê-lo, por exemplo, você pode me mostrar um exemplo. Descobri que o histograma é verde e se a linha estiver abaixo do histograma, dá um sinal de compra. O mesmo para venda.
Arquivos anexados:
 
PapaYozh >>:


какова размерность массива x10 ?

10?
Тогда надо так переписать:

и не понятно, что именно вы хотите получить в массивах MAX и MIN

Deixe-me explicar novamente :)

Há uma matriz que contém todos os valores das colunas MACD.

Precisamos pegar de todos esses valores uma dúzia de valores (em ordem) e procurar o valor máximo neles, e respectivamente desenhá-lo no indicador, e assim por diante até o final.

Aqui está o código, mais uma vez:

for(i=0; i<50; i=i+10) //общий цикл для всех значений МАКД, шаг 10
       {
         int k = i;
         for(k=i; k<i+10; k++) // цикл внутри десятки значений, шаг 1
             {       
              x10[k] = MACD[k];// массив десяток
             }
         int IndexMAX = ArrayMaximum(x10); // найден индекс максимального значения внутри десятки 
         int IndexMIN = ArrayMinimum(x10); // --//--   
         MAX[k] = MACD[IndexMAX]; // Рисуем найденное максимальное значение внутри десятки на k баре
         MIN[k] = MACD[IndexMIN];
       }

A meu ver, não está desenhado porque o índice de array com dezenas não coincide com o índice deste valor no array principal com os valores MAKD.

Em outras palavras, quando o contador alcançar, digamos, 30 no laço principal, então no subciclo irá 30-31-32...39 (vamos supor, o máximo deles será 34 valor), a função Arraymaximum(x10) irá encontrá-lo, mas escreverá no IndexMAX exatamente o número ordinal no array HIS (x10), ou seja, na verdade o valor verdadeiro será 34, mas escreverá outro (de 0 a 9, porque é um array de dezenas). Não consigo descobrir o que fazer...

 
Noterday писал(а) >>

Deixe-me explicar novamente :)

Há uma matriz que contém todos os valores das colunas MACD.

Precisamos pegar de todos esses valores uma dúzia de valores (em ordem) e procurar o valor máximo neles, e respectivamente desenhá-lo no indicador, e assim por diante até o final.

Aqui está o código, mais uma vez:

A meu ver, não está desenhado porque o índice de array com dezenas não coincide com o índice deste valor no array principal com os valores MAKD.

Em outras palavras, quando o contador alcançar, digamos, 30 no laço principal, então no subciclo irá 30-31-32...39 (vamos supor, o máximo deles será 34 valor), a função Arraymaximum(x10) irá encontrá-lo, mas escreverá no IndexMAX exatamente o número ordinal no array HIS (x10), ou seja, na verdade o valor verdadeiro será 34, mas escreverá outro (de 0 a 9, porque é um array de dezenas). Não consigo descobrir o que fazer...


Mostrar todo o código para o indicador
 
Vinin >>:


Весь код индикатора покажи
//+------------------------------------------------------------------+
//|                                                  Custom MACD.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                                        Alexander |
//+------------------------------------------------------------------+
#property  copyright "none"
#property  link      "none"
//---- indicator settings
#property  indicator_separate_window
#property indicator_buffers 4

#property indicator_color1 MediumPurple
#property indicator_color2 MediumPurple
#property indicator_color3 Green
#property indicator_color4 Red

#property indicator_width1 1
#property indicator_width2 1

//---- indicator parameters
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;
//---- indicator buffers
double     MACD[];
double     SMACD[];
double     MAX[];
double     MIN[];
double     x10[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(5);
   
   SetIndexBuffer(0,MACD);
   SetIndexBuffer(1,SMACD);
   SetIndexBuffer(2,MAX);
   SetIndexBuffer(3,MIN);
   SetIndexBuffer(4,x10);
   
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexStyle(1,DRAW_LINE);
   
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexArrow(2,119);
   
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexArrow(3,119);
   
   SetIndexStyle(4,DRAW_NONE);
   
   SetIndexDrawBegin(1,SMACD);
   IndicatorDigits(Digits+2);

   IndicatorShortName("MACD("+FastEMA+","+SlowEMA+","+SignalSMA+")");
   SetIndexLabel(0,"MACD");
   SetIndexLabel(1,"Signal");

   return(0);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars=IndicatorCounted();

   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

   for(int i=0; i<limit; i++)
      MACD[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);

   for(i=0; i<limit; i++)
      SMACD[i]=iMAOnArray(MACD,Bars,SignalSMA,0,MODE_SMA,i);
      
      
   for(i=0; i<limit; i=i+10)
       {
         int k = i;
         for(k=i; k<i+10; k++)
             {       
              x10[k] = MACD[k];// массив десяток
             }
         int IndexMAX = ArrayMaximum(x10);
         int IndexMIN = ArrayMinimum(x10);    
         MAX[k] = MACD[IndexMAX];
         MIN[k] = MACD[IndexMIN];
       }
   return(0);
  }
//+------------------------------------------------------------------+

int deinit()
{   
return(0);
}
 
Noterday писал(а) >>

Deixe-me explicar novamente :)

Acho que você queria escrever assim:

for(i=0; i<limit; i+=10) //общий цикл для всех значений МАКД, шаг 10
       {
         int k;
         for(k=0; k<10; k++) // цикл внутри десятки значений, шаг 1
             {       
              x10[k] = MACD[i+k];// массив десяток
             }
         int IndexMAX = ArrayMaximum(x10); // найден индекс максимального значения внутри десятки 
         int IndexMIN = ArrayMinimum(x10); // --//--   
         MAX[k] = x10[IndexMAX]; // Рисуем найденное максимальное значение внутри десятки на k баре
         MIN[k] = x10[IndexMIN];
       }
 
Noterday писал(а) >>


Qual é seu objetivo?
Bem, o que você quer obter. Quebrá-lo em dezenas é inútil. Eles se movem no tempo o tempo todo.

 
PapaYozh >>:

мне кажется, Вы хотели написать вот так:

Não desenha :((.

s.w. k=0 Eu terminei :)

 
Vinin >>:


А какую цель преследуешь?
Ну, что хочешь получить. Разбивать на десятки бесмысленно. Они все время передвигаются во времени.

Sim, o objetivo é literal...quero que o máximo seja exibido entre cada 10 barras...