Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 287

 
artmedia70:

In dieser Situation müssen Sie den Code ergänzen. Erstellen Sie eine externe Variable, zum Beispiel Appled_Price.

Und Sie ändern alle PRICE_CLOSE im Code in Appled_Price.


Ah, ja, Entschuldigung, ich meinte die neuen Builds, und da gibt es einen etwas ungewöhnlichen Code.

Das ist die Sache, der Code hat keinen Freiform-Preis, alles ist in Arrays, man kann es einfach nicht ändern, ich habe es versucht (((

Und wenn es funktioniert, wie kann man eine Auswahl aus einer Dropdown-Liste treffen (wie in dem Bild aus meiner Frage)?


//+------------------------------------------------------------------+
//|                                       Custom Moving Averages.mq4 |
//|                   Copyright 2005-2013, MetaQuotes Software Corp. |
//|                                              https://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2013, MetaQuotes Software Corp."
#property link        "https://www.mql4.com"
#property description "Moving Average"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//--- indicator parameters
input int            InpMAPeriod=13;        // Period
input int            InpMAShift=0;          // Shift
input ENUM_MA_METHOD InpMAMethod=MODE_SMA;  // Method
//--- indicator buffer
double ExtLineBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   string short_name;
   int    draw_begin=InpMAPeriod-1;
//--- indicator short name
   switch(InpMAMethod)
     {
      case MODE_SMA  : short_name="SMA(";                break;
      case MODE_EMA  : short_name="EMA(";  draw_begin=0; break;
      case MODE_SMMA : short_name="SMMA(";               break;
      case MODE_LWMA : short_name="LWMA(";               break;
      default :        return(INIT_FAILED);
     }
   IndicatorShortName(short_name+string(InpMAPeriod)+")");
   IndicatorDigits(Digits);
//--- check for input
   if(InpMAPeriod<2)
      return(INIT_FAILED);
//--- drawing settings
   SetIndexStyle(0,DRAW_LINE);
   SetIndexShift(0,InpMAShift);
   SetIndexDrawBegin(0,draw_begin);
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtLineBuffer);
//--- initialization done
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|  Moving Average                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- check for bars count
   if(rates_total<InpMAPeriod-1 || InpMAPeriod<2)
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtLineBuffer,false);
   ArraySetAsSeries(close,false);
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
      ArrayInitialize(ExtLineBuffer,0);
//--- calculation
   switch(InpMAMethod)
     {
      case MODE_EMA:  CalculateEMA(rates_total,prev_calculated,close);        break;
      case MODE_LWMA: CalculateLWMA(rates_total,prev_calculated,close);       break;
      case MODE_SMMA: CalculateSmoothedMA(rates_total,prev_calculated,close); break;
      case MODE_SMA:  CalculateSimpleMA(rates_total,prev_calculated,close);   break;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|   simple moving average                                          |
//+------------------------------------------------------------------+
void CalculateSimpleMA(int rates_total,int prev_calculated,const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
   
     {
      limit=InpMAPeriod;
      //--- calculate first visible value
      double firstValue=0;
      for(i=0; i<limit; i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else
      limit=prev_calculated-1;
//--- main loop
   for(i=limit; i<rates_total && !IsStopped(); i++)
      ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
//---
  }
//+------------------------------------------------------------------+
//|  exponential moving average                                      |
//+------------------------------------------------------------------+
void CalculateEMA(int rates_total,int prev_calculated,const double &price[])
  {
   int    i,limit;
   double SmoothFactor=2.0/(1.0+InpMAPeriod);
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
     {
      limit=InpMAPeriod;
      ExtLineBuffer[0]=price[0];
      for(i=1; i<limit; i++)
         ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor);
     }
   else
      limit=prev_calculated-1;
//--- main loop
   for(i=limit; i<rates_total && !IsStopped(); i++)
      ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor);
//---
  }
//+------------------------------------------------------------------+
//|  linear weighted moving average                                  |
//+------------------------------------------------------------------+
void CalculateLWMA(int rates_total,int prev_calculated,const double &price[])
  {
   int        i,limit;
   static int weightsum;
   double     sum;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
     {
      weightsum=0;
      limit=InpMAPeriod;
      //--- calculate first visible value
      double firstValue=0;
      for(i=0;i<limit;i++)
        {
         int k=i-1;
         weightsum+=k;
         firstValue+=k*price[i];
        }
      firstValue/=(double)weightsum;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else
      limit=prev_calculated-1;
//--- main loop
   for(i=limit; i<rates_total && !IsStopped(); i++)
     {
      sum=0;
      for(int j=0;j<InpMAPeriod;j++)
         sum+=(InpMAPeriod-j)*price[i-j];
      ExtLineBuffer[i]=sum/weightsum;
     }
//---
  }
//+------------------------------------------------------------------+
//|  smoothed moving average                                         |
//+------------------------------------------------------------------+
void CalculateSmoothedMA(int rates_total,int prev_calculated,const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
     {
      limit=InpMAPeriod;
      double firstValue=0;
      for(i=0; i<limit; i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else
      limit=prev_calculated-1;
//--- main loop
   for(i=limit; i<rates_total && !IsStopped(); i++)
      ExtLineBuffer[i]=(ExtLineBuffer[i-1]*(InpMAPeriod-1)+price[i])/InpMAPeriod;
//---
  }
//+------------------------------------------------------------------+
 
evillive:

Das ist das Problem, es gibt keinen kostenlosen Preis im Code, man kann ihn nicht einfach ersetzen(((

Versuchen Sie es hier

switch(InpMAMethod)
     {
      case MODE_EMA:  CalculateEMA(rates_total,prev_calculated,close);        break;
      case MODE_LWMA: CalculateLWMA(rates_total,prev_calculated,close);       break;
      case MODE_SMMA: CalculateSmoothedMA(rates_total,prev_calculated,close); break;
      case MODE_SMA:  CalculateSimpleMA(rates_total,prev_calculated,close);   break;
     }

ändern Sie schließen in öffnen. Wenn die Zählung mit "offen" beginnt, dann graben Sie in diese Richtung, um diesen Wert zu ändern. Ich kann Beta-Terminal jetzt nicht starten, um den Editor zu durchsuchen.

Ändern Sie hier vorher den Wert:

//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtLineBuffer,false);
   ArraySetAsSeries(close,false);
//--- first calculation or number of bars was changed
 
Es macht keinen Sinn, "Schließen" in "Öffnen" zu ändern, da sich kaum etwas ändern wird. Es ist einfacher, sich nicht mit solchem Unsinn zu beschäftigen, sondern die Daten aus dem geformten Balken zu nehmen.
 

Grüße an alle))

Ich habe einen EA geschrieben, aber er funktioniert überhaupt nicht)))) oder er funktioniert nicht richtig. Ich habe herumgestochert und viele Dinge repariert, aber trotzdem funktioniert der EA nicht.

Hier ist ein Fragment der Berechnung von Handelsentscheidungen auf der Grundlage des RSI-Indikators:

//--------------------Данные------------------------------------

   int Ticket1_RSI=-1, Ticket2_RSI=-1;                    // Номера открытых ордеров
   extern double Lot=0.01;                                 // Объем лота
int RSI()                                                  // Функция RSI
   {                                                                                                             
   double T, P;
   double RSI_0, RSI_1, RSI_2;                      // Значения индикатора RSI
//------------------Значения индикатора---------------------------------------   
   RSI_0=iRSI(Symbol(), 0, 14, PRICE_CLOSE, 0);              // Получаем данные от RSI 
   RSI_1=iRSI(Symbol(), 0, 14, PRICE_CLOSE, 1);              // Получаем данные от RSI 
   RSI_2=iRSI(Symbol(), 0, 14, PRICE_CLOSE, 2);              // Получаем данные от RSI 
//------------------Условие на продажу---------------------------------   
   if (RSI_1 > RSI_0 > 70 && RSI_1 > RSI_2)         // Если индикатор превышает значение 70 и виден поворот вниз
      {                                                                                                           
      if (Ticket2_RSI > 0)                                                     // Если имеется ордер на покупку
         OrderClose(Ticket2_RSI, OrderLots(), Bid, 0, 0);                            // Закрытие ордера на покупку
      if (Ticket1_RSI <= 0)                                                    // Если ордера на продажу нет
         {
         Ticket1_RSI=OrderSend(Symbol(), OP_SELL, Lot, Bid, 2, 0, 0);        // Открытие ордера на продажу
         if (OrderSelect(Ticket1_RSI, SELECT_BY_TICKET)==true)
            {
            T=OrderOpenTime();
            P=OrderOpenPrice();
            ObjectCreate("Arrow", 22, 0, T, P);               // Создание индикатора ордера
            ObjectSet("Arrow", OBJPROP_COLOR, IndianRed);                             // Изменение цвета в мутно-красноватый
            ObjectSet("Arrow", OBJPROP_ARROWCODE, 242);                               // Направление стрелки вниз
            ObjectCreate("Text", 21, 0, T, P);                // Создание текстового объекта
            ObjectSetText("Text", "Open sell-order by RSI", 6, "Times New Roman", Navy);     // Текст, шрифт, стиль, цвет     
            }
         }
      }
//-------------------Условие на покупку--------------------------------   
   if (RSI_1 < RSI_0 < 30 &&  RSI_1 < RSI_2)         // Если индикатор ниже значения 30 и виден поворот вверх
      {
      if (Ticket1_RSI > 0)                                                     // Если имеется ордер на продажу
         OrderClose(Ticket1_RSI, OrderLots(), Ask, 0, 0);                            // Закрытие ордера на продажу
      if (Ticket2_RSI <= 0)                                                    // Если ордера на продажу нет
         {
         Ticket2_RSI=OrderSend(Symbol(), OP_BUY, Lot, Ask, 2, 0, 0);         // Открытие ордера на покупку
         if (OrderSelect(Ticket2_RSI, SELECT_BY_TICKET)==true)
            {
            T=OrderOpenTime();
            P=OrderOpenPrice();
            ObjectCreate("Arrow", 22, 0, T, P);   // Создание индикатора ордера          
            ObjectSet("Arrow", OBJPROP_COLOR, LawnGreen);                             // Изменение цвета в ярко-зеленый
            ObjectSet("Arrow", OBJPROP_ARROWCODE, 241);                               // Направление стрелки вверх
            ObjectCreate("Text", 21, 0, T, P);     // Создание текстового объекта
            ObjectSetText("Text", "Open buy-order by RSI", 6, "Times New Roman", Navy);      // Текст, шрифт, стиль, цвет
            }
         }   
      }
//--------------------------------------------------------------------   
   return;    
   } 

Das Problem ist, dass der EA trotz des Wertes des Indikators sofort einen Kaufauftrag eröffnet und ihn nicht schließen will. Objekte wie Text und Pfeile werden nicht angezeigt.

Helfen Sie mir, dies herauszufinden)) gerade neu zu diesem selbst

 
waroder:

Grüße an alle))

Ich habe einen EA geschrieben, aber er funktioniert überhaupt nicht)))) oder er funktioniert nicht richtig. Ich habe herumgestochert und viele Dinge repariert, aber trotzdem funktioniert der EA nicht.

Hier ist ein Fragment der Berechnung von Handelsentscheidungen auf der Grundlage des RSI-Indikators:

//--------------------Данные------------------------------------

Das Problem ist, dass der EA trotz des Wertes des Indikators sofort einen Kaufauftrag eröffnet und ihn nicht schließen will. Objekte wie Text und Pfeile werden nicht angezeigt.

Helfen Sie mir, dies herauszufinden)) gerade neu zu diesem selbst


if (RSI_1 > RSI_0 && RSI_0 > 70 && RSI_1 > RSI_2)         // Если индикатор превышает значение 70 и виден поворот вниз
 
Vinin:



Man muss also jede Ungleichung einzeln in die Bedingungen schreiben? Wenn man irgendwie verallgemeinert, wird das als Fehler angesehen? Warum sagt das Programm dann beim Kompilieren, dass es keine Fehler gibt?
 
waroder:

Man muss also jede Ungleichung einzeln in die Bedingungen schreiben? Wenn man sie irgendwie verallgemeinert, wird das als Fehler wahrgenommen? Warum sagt das Programm dann beim Kompilieren, dass es keinen Fehler gibt?

Es liegt kein Fehler vor, Sie erhalten nur nicht das erwartete Ergebnis.
 
hoz:

...Wie suchen Sie in einer solchen Situation nach der Ursache?


Ich bin rein zufällig darüber gestolpert. Sie müssen die Dinge vereinfachen. Alles auskommentieren, den ersten Import auskommentieren, kompilieren, Funktionen aufrufen, usw.


 
Integer:
Es macht keinen Sinn, "Schließen" in "Öffnen" zu ändern, da sich kaum etwas ändern wird. Es ist einfacher, sich nicht mit solchem Unsinn zu beschäftigen, sondern die Daten aus dem geformten Balken zu nehmen.
Ich stimme zu, aber da es eine Frage gab...
 
Vinin:

Es liegt kein Fehler vor, Sie erhalten nur nicht das erwartete Ergebnis.


Ich habe es herausgefunden)) wurde ein Auftrag sofort ohne weitere Änderungen geöffnet, weil ich in der Zeile NULL statt Symbol() schreiben musste:

   RSI_1=iRSI(Symbol(), 0, 14, PRICE_CLOSE, 1);              // Получаем данные от RSI 

Sie müssen NULL anstelle von Symbol() schreiben, weil es eine Diskrepanz zwischen den Variablentypen gibt. Deshalb sah ich RSI als Nullwert, also öffnete ich es sofort, weil die Bedingung funktionierte.

Ich habe das Problem jetzt behoben und alles ist in Ordnung.

Das einzige Problem ist, dass die Objekte nur einmal beim ersten Handel erstellt werden.