[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 485

 
Au SL, l'EA doit ouvrir un ordre du même type et au TP du type opposé !
Mais pour une raison quelconque, l'EA ouvre souvent un ordre du mauvais type !



//+------------------------------------------------------------------+
//|                                                      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);
   //-----
}
S'il vous plaît, dites-moi où il y a une erreur !
 
Kogalym писал(а) >>
A SL l'EA doit ouvrir un ordre du même type et à TP du type opposé !
Mais pour une raison quelconque, l'EA ouvre souvent l'ordre du mauvais type !



Pouvez-vous me dire où se trouve l'erreur ?

if(OrderType() == OP_SELL)
   if(OrderProfit()>0)
C'est à cela que sert la sélection.
 
Qui sait si cet indicateur est adapté à un EA, j'ai trouvé une stratégie où il est appliqué par l'auteur, peut-on l'écrire dans l'EA et comment le faire, par exemple, pouvez-vous me montrer un exemple. J'ai constaté que l'histogramme est vert et que si la ligne est en dessous de l'histogramme, cela donne un signal d'achat. Il en va de même pour la vente.
Dossiers :
 
PapaYozh >>:


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

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

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

Laissez-moi vous expliquer à nouveau :)

Il existe un tableau qui contient toutes les valeurs des colonnes MACD.

Nous devons prendre une douzaine de toutes ces valeurs (dans l'ordre) et chercher la valeur maximale dans celles-ci, et la dessiner dans l'indicateur, et ainsi de suite jusqu'à la fin.

Voici à nouveau le code :

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

Comme je le vois, il n'est pas dessiné parce que l'index du tableau des dizaines ne coïncide pas avec l'index de cette valeur dans le tableau principal des valeurs MAKD.

En d'autres termes, lorsque le compteur atteint, disons, 30 dans la boucle principale, puis dans le sous-cycle 30-31-32...39 (supposons que le maximum d'entre eux sera la valeur 34), la fonction Arraymaximum(x10) le trouvera, mais écrira dans IndexMAX exactement le nombre ordinal dans le tableau HIS (x10), c'est-à-dire que la vraie valeur sera 34, mais elle écrira un autre (de 0 à 9, parce que c'est un tableau de dizaines). Je n'arrive pas à savoir ce qu'il faut faire...

 
Noterday писал(а) >>

Laissez-moi vous expliquer à nouveau :)

Il existe un tableau qui contient toutes les valeurs des colonnes MACD.

Nous devons prendre parmi toutes ces valeurs une douzaine de valeurs (dans l'ordre) et y chercher la valeur maximale, et respectivement la dessiner dans l'indicateur, et ainsi de suite jusqu'à la fin.

Voici à nouveau le code :

Comme je le vois, il n'est pas dessiné parce que l'index du tableau des dizaines ne coïncide pas avec l'index de cette valeur dans le tableau principal des valeurs MAKD.

En d'autres termes, lorsque le compteur atteint, disons, 30 dans la boucle principale, puis dans le sous-cycle 30-31-32...39 (supposons que le maximum d'entre eux sera la valeur 34), la fonction Arraymaximum(x10) le trouvera, mais écrira dans IndexMAX exactement le nombre ordinal dans le tableau HIS (x10), c'est-à-dire que la vraie valeur sera 34, mais elle écrira un autre (de 0 à 9, parce que c'est un tableau de dizaines). Je n'arrive pas à savoir ce qu'il faut faire...


Afficher tout le code de l'indicateur
 
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 писал(а) >>

Laissez-moi vous expliquer à nouveau :)

Je pense que tu voulais écrire comme ça :

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


Quel est votre objectif ?
Eh bien, que voulez-vous obtenir. La décomposition en dizaines est inutile. Ils se déplacent dans le temps tout le temps.

 
PapaYozh >>:

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

Il ne dessine pas :((.

s.w. k=0 Je l'ai terminé :)

 
Vinin >>:


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

Oui le but est littéral...je veux que le maximum soit affiché parmi toutes les 10 barres....