[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 485

 
Bei SL sollte der EA eine Order des gleichen Typs und bei TP des entgegengesetzten Typs eröffnen!
Aber aus irgendeinem Grund öffnet der EA oft eine Bestellung des falschen Typs!



//+------------------------------------------------------------------+
//|                                                      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);
   //-----
}
Bitte sagen Sie mir, wo es einen Fehler gibt!
 
Kogalym писал(а) >>
Bei SL sollte der EA eine Order des gleichen Typs und bei TP des entgegengesetzten Typs eröffnen!
Aber aus irgendeinem Grund öffnet der EA oft die Bestellung des falschen Typs!



Können Sie mir sagen, wo der Fehler liegt?

if(OrderType() == OP_SELL)
   if(OrderProfit()>0)
Dafür ist die Auswahl da.
 
Wer weiß, ob dieser Indikator für einen EA geeignet ist, fand ich eine Strategie, wo es durch den Autor angewendet wird, kann es in der EA geschrieben werden und wie es zu tun, zum Beispiel, können Sie mir ein Beispiel zeigen. Ich habe festgestellt, dass das Histogramm grün ist, und wenn die Linie unterhalb des Histogramms liegt, ist das ein Kaufsignal. Dasselbe gilt für den Verkauf.
 
PapaYozh >>:


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

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

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

Lassen Sie es mich noch einmal erklären :)

Es gibt ein Array, das alle Werte der MACD-Spalten enthält.

Wir müssen aus all diesen Werten ein Dutzend Werte (in der richtigen Reihenfolge) nehmen und darin den Maximalwert suchen, den wir dann in den Indikator einzeichnen, und so weiter bis zum Ende.

Hier ist der Code noch einmal:

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

So wie ich es sehe, wird es nicht gezeichnet, weil der Index des Arrays mit den Zehnerwerten nicht mit dem Index dieses Wertes im Hauptarray mit den MAKD-Werten übereinstimmt.

Mit anderen Worten, wenn der Zähler in der Hauptschleife z.B. 30 erreicht, und dann in den Unterzyklen 30-31-32...39 (nehmen wir an, das Maximum davon ist der Wert 34), findet die Funktion Arraymaximum(x10) diesen Wert, schreibt aber in IndexMAX genau die Ordnungszahl in HIS (x10) Array, d.h. der tatsächliche Wert ist 34, aber es wird ein anderer Wert geschrieben (von 0 bis 9, weil es ein Array von Zehnern ist). Ich kann nicht herausfinden, was ich tun soll...

 
Noterday писал(а) >>

Lassen Sie es mich noch einmal erklären :)

Es gibt ein Array, das alle Werte der MACD-Spalten enthält.

Wir müssen aus all diesen Werten ein Dutzend Werte (in der richtigen Reihenfolge) nehmen und darin den Maximalwert suchen, den wir dann in den Indikator einzeichnen, und so weiter bis zum Ende.

Hier ist der Code noch einmal:

So wie ich es sehe, wird es nicht gezeichnet, weil der Index des Arrays mit den Zehnerwerten nicht mit dem Index dieses Wertes im Hauptarray mit den MAKD-Werten übereinstimmt.

Mit anderen Worten, wenn der Zähler in der Hauptschleife z.B. 30 erreicht, und dann in den Unterzyklen 30-31-32...39 (nehmen wir an, das Maximum davon ist der Wert 34), findet die Funktion Arraymaximum(x10) diesen Wert, schreibt aber in IndexMAX genau die Ordnungszahl in HIS (x10) Array, d.h. der tatsächliche Wert ist 34, aber es wird ein anderer Wert geschrieben (von 0 bis 9, weil es ein Array von Zehnern ist). Ich kann nicht herausfinden, was ich tun soll...


Den gesamten Code für den Indikator anzeigen
 
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 писал(а) >>

Lassen Sie es mich noch einmal erklären :)

Ich glaube, du wolltest so schreiben:

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


Was ist Ihr Ziel?
Nun, was wollen Sie bekommen. Eine Aufteilung in Zehnergruppen ist sinnlos. Sie bewegen sich ständig in der Zeit.

 
PapaYozh >>:

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

Zeichnet nicht :((.

s.w. k=0 Ich habe es beendet :)

 
Vinin >>:


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

Ja, das Ziel ist wörtlich zu nehmen... Ich möchte, dass der Höchstwert unter allen 10 Balken angezeigt wird...

Grund der Beschwerde: