[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 485

 
Allo SL, l'EA dovrebbe aprire un ordine dello stesso tipo e al TP del tipo opposto!
Ma per qualche motivo l'EA apre spesso un ordine del tipo sbagliato!



//+------------------------------------------------------------------+
//|                                                      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);
   //-----
}
Per favore, ditemi dove c'è un errore!
 
Kogalym писал(а) >>
Allo SL l'EA dovrebbe aprire un ordine dello stesso tipo e al TP del tipo opposto!
Ma per qualche motivo l'EA apre spesso l'ordine del tipo sbagliato!



Puoi dirmi dov'è l'errore?

if(OrderType() == OP_SELL)
   if(OrderProfit()>0)
È a questo che serve la selezione.
 
Chi sa se questo indicatore è adatto ad un EA, ho trovato una strategia dove è applicato dall'autore, può essere scritto nell'EA e come farlo, per esempio, puoi mostrarmi un esempio. Ho scoperto che l'istogramma è verde e se la linea è sotto l'istogramma, dà un segnale di acquisto. Lo stesso per la vendita.
 
PapaYozh >>:


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

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

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

Lasciatemi spiegare di nuovo :)

C'è un array che contiene tutti i valori delle colonne MACD.

Dobbiamo prendere una dozzina di tutti quei valori (in ordine) e cercare il valore massimo in essi, e disegnarlo nell'indicatore, e così via fino alla fine.

Ecco di nuovo il codice:

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

Per come la vedo io, non viene disegnato perché l'indice dell'array con le decine non coincide con l'indice di questo valore nell'array principale con i valori MAKD.

In altre parole, quando il contatore raggiunge, diciamo, 30 nel ciclo principale, poi nel sottociclo andrà 30-31-32...39 (supponiamo, il massimo di loro sarà il valore 34), la funzione Arraymaximum(x10) lo troverà, ma scriverà in IndexMAX esattamente il numero ordinale del SUO (x10) array, cioè in realtà il vero valore sarà 34, ma ne scriverà un altro (da 0 a 9, perché è un array di decine). Non riesco a capire cosa fare...

 
Noterday писал(а) >>

Lasciatemi spiegare di nuovo :)

C'è un array che contiene tutti i valori delle colonne MACD.

Dobbiamo prendere da tutti quei valori una dozzina di valori (in ordine) e cercare il valore massimo in essi, e rispettivamente disegnarlo nell'indicatore, e così via fino alla fine.

Ecco di nuovo il codice:

Per come la vedo io, non viene disegnato perché l'indice dell'array con le decine non coincide con l'indice di questo valore nell'array principale con i valori MAKD.

In altre parole, quando il contatore raggiunge, diciamo, 30 nel ciclo principale, poi nel sottociclo andrà 30-31-32...39 (supponiamo, il massimo di loro sarà il valore 34), la funzione Arraymaximum(x10) lo troverà, ma scriverà in IndexMAX esattamente il numero ordinale del SUO (x10) array, cioè in realtà il vero valore sarà 34, ma ne scriverà un altro (da 0 a 9, perché è un array di decine). Non riesco a capire cosa fare...


Mostra tutto il codice dell'indicatore
 
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 писал(а) >>

Lasciatemi spiegare di nuovo :)

Credo che tu volessi scrivere così:

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 è il suo obiettivo?
Beh, cosa vuoi ottenere. Suddividerlo in decine è inutile. Si spostano continuamente nel tempo.

 
PapaYozh >>:

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

Non disegna :(((.

s.w. k=0 l'ho finito :)

 
Vinin >>:


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

Sì, l'obiettivo è letterale... voglio che il massimo sia visualizzato tra ogni 10 barre...

Motivazione: