[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 485

 
¡En el SL, el EA debe abrir una orden del mismo tipo y en el TP del tipo contrario!
Pero, por alguna razón, el EA suele abrir un pedido del tipo equivocado.



//+------------------------------------------------------------------+
//|                                                      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, dígame dónde hay un error.
 
Kogalym писал(а) >>
¡En el SL el EA debe abrir una orden del mismo tipo y en el TP del tipo contrario!
¡Pero por alguna razón el EA suele abrir el pedido del tipo equivocado!



¿Puede decirme dónde está el error?

if(OrderType() == OP_SELL)
   if(OrderProfit()>0)
Para eso está la selección.
 
Quien sabe si este indicador sirve para un EA, encontré una estrategia donde lo aplica el autor, se puede escribir en el EA y como hacerlo, por ejemplo, me puedes mostrar un ejemplo. He comprobado que el histograma es verde y si la línea está por debajo del histograma, da una señal de compra. Lo mismo para vender.
Archivos adjuntos:
 
PapaYozh >>:


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

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

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

Déjeme explicarle de nuevo :)

Hay un array que contiene todos los valores de las columnas del MACD.

Tenemos que tomar una docena de todos esos valores (en orden) y buscar el valor máximo en ellos, y dibujarlo en el indicador, y así hasta el final.

Aquí está el código una vez más:

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];
       }

Según veo, no se dibuja porque el índice del array con decenas no coincide con el índice de este valor en el array principal con valores MAKD.

En otras palabras, cuando el contador llega, digamos, a 30 en el bucle principal, entonces en el subciclo irá a 30-31-32...39 (supongamos, el máximo de ellos será el valor 34), la función Arraymaximum(x10) lo encontrará, pero escribirá en IndexMAX exactamente el número ordinal en su array (x10), es decir, en realidad el valor verdadero será 34, pero escribirá algún otro (de 0 a 9, porque es un array de decenas). No sé qué hacer...

 
Noterday писал(а) >>

Déjeme explicarle de nuevo :)

Hay un array que contiene todos los valores de las columnas del MACD.

Tenemos que tomar de todos esos valores una docena de valores (en orden) y buscar el valor máximo en ellos, y respectivamente dibujarlo en el indicador, y así hasta el final.

Aquí está el código una vez más:

Según veo, no se dibuja porque el índice del array con decenas no coincide con el índice de este valor en el array principal con valores MAKD.

En otras palabras, cuando el contador llega, digamos, a 30 en el bucle principal, entonces en el subciclo irá a 30-31-32...39 (supongamos, el máximo de ellos será el valor 34), la función Arraymaximum(x10) lo encontrará, pero escribirá en IndexMAX exactamente el número ordinal en su array (x10), es decir, en realidad el valor verdadero será 34, pero escribirá algún otro (de 0 a 9, porque es un array de decenas). No sé qué hacer...


Mostrar todo el código del 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 писал(а) >>

Déjeme explicarle de nuevo :)

Creo que querías escribir así:

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 писал(а) >>


¿Cuál es su objetivo?
Bueno, qué quieres conseguir. Desglosarlo en decenas no tiene sentido. Se mueven en el tiempo todo el tiempo.

 
PapaYozh >>:

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

No dibuja :((.

s.w. k=0 lo he terminado :)

 
Vinin >>:


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

Sí, el objetivo es literal... Quiero que el máximo se muestre entre cada 10 barras...