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

 
gyfto:

Ich habe eine kindische Frage. Variablen werden in der Kopfzeile des Codes deklariert. Sie sollen global sein. Aber ich verstehe den Unterschied nicht

von

wenn diese Variable in der Kopfzeile deklariert ist. Idealerweise nach Umfang der Variablen. Aber in beiden Fällen ist sie innerhalb der Funktion sichtbar. Ich habe einen Test gemacht (Skript):

- Ich habe keine Unterschiede festgestellt. Können Sie mir den Unterschied erklären, denn ich verstehe ihn nicht.

Da ist ein zusätzlicher Statiker drin. Es geht aber auch ohne sie. Es ist sinnvoll, Statiken innerhalb von Funktionen zu deklarieren. Nur der Umfang des Funktionsblocks.
 
Zhunko:
Es ist sinnvoll, Statiken innerhalb von Funktionen zu deklarieren. Der Bereich ist nur ein Funktionsblock.


Es funktioniert auf die gleiche Weise:

int a = 10;
int start(){
   Alert(StringConcatenate("st: a = ", a));//st: a = 10
   f1(); Alert(StringConcatenate("f1: a = ", a));//f1: a = 10
   f2(); Alert(StringConcatenate("f2: a = ", a));//f2: a = 10
}
void f1(){
   int a = 11;
   return;
}
void f2(){
   static int a = 12;
   return;
}

In welchem Fall wird sich der Unterschied bemerkbar machen? ALXIMIKS, auch Ihnen vielen Dank für Ihre Antwort.

 

Hallo!

Können Sie mir sagen, wie ich einen zusätzlichen Indikator/Roboter auf einem mt4 installieren kann, das auf einem iphone/ipad installiert ist? Ist es prinzipiell möglich? Bei Windows ist es elementar einfach, aber bei den mobilen Produkten von Apple ist es nicht so offensichtlich.

Die Logik sagt, dass dies möglich ist. Schließlich sind einige Indikatoren bereits vorinstalliert. Aber es ist nicht klar, was und wohin kopiert werden soll, die Dateistruktur ist anders. Ist jemand nicht auf ein solches Problem gestoßen?

Vielen Dank im Voraus.

 

Ich erstelle einen Indikator, der auf gleitenden Durchschnitten basiert. Dabei geht es darum, unbedeutende Bewegungen innerhalb bestimmter Punkte abzuschneiden. Nehmen wir an, wir setzen einen Filter von 50 Pips. Der Indikator ist rückläufig, aber der Rückgang beträgt weniger als 50 Pips, daher nehmen wir den gestrigen Wert des Durchschnitts und notieren ihn und setzen sein Niveau für das aktuelle Datum. Beim nächsten Balken überprüfen wir die Differenz, d. h. den aktuellen Wert minus den von uns aufgezeichneten Wert. Wenn die Summe 50 Pips nicht überschreitet, setzen wir den in der statischen Variable gespeicherten Wert auf den aktuellen Wert. Überschreitet der Wert diesen Wert, wird er zum aktuellen Wert, d.h. ähnlich wie ein gleitender Durchschnitt mit einer Verschiebung von Null.Ich habe verschiedene Varianten ausprobiert, aber bis jetzt habe ich noch nicht die richtige Lösung gefunden.

Der Einfachheit halber füge ich den Code für das Zeichnen nur der Deklinationen bei. Das Problem ist, dass der Indikator auf den Anstieg zeichnet. Und das wichtigste ist, dass ich, wenn ich es im Tester laufen lasse, visuell sehen kann, wie sich der Indikator ändert, während es außerhalb des Filters keinen Ausgang gibt. Ich nehme an, dass irgendwo der Wert des aufgezeichneten "MA_otshet"-Werts verloren gegangen ist.

#property indicator_chart_window
#property indicator_buffers 1
#property  indicator_color1 Red 
//--- input parameters
//--- buffers
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,0,1);
   SetIndexBuffer(0,ExtMapBuffer1);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),                      
    limit;
    double
    raznica,raznica_static,MA_0_t,MA_1_t;
   static double MA_otshet;  //здесь хранится запись значения MA_otshet
   
   for(int i=0;i<Bars;i++)
   {  
      MA_0_t=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,i+0);  
      MA_1_t=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,i+1); 
      raznica=MA_0_t-MA_1_t; //разница между сегодня и вчера по скользящей средней
      raznica_static=MA_0_t-MA_otshet; //разница между сегодня и MA_otshet

      if(raznica > -0.005 && raznica <= 0) // если raznica не превышает заданное число 
          {
          MA_otshet=MA_1_t; // записываем значение MA_otshet
          }
      if(raznica_static > - 0.005 && raznica_static <= 0) //если raznica_static не превышает заданное число
          {
          ExtMapBuffer1[i]=MA_otshet;  // то рисуем значение индикатора, как записанный MA_otshet
          }
      if(raznica_static < - 0.005) // если raznica превышает заданное число
          {
          ExtMapBuffer1[i]=MA_0_t; // то рисуем значение по текущей цене
          }
   } 
   return(0);
  }
//+------------------------------------------------------------------+
 

Guten Tag, bitte helfen Sie mir.

Alle Aufträge müssen um 23.55 Uhr geschlossen werden, und am Freitag endet der Handel um 22.00 Uhr, so dass es ein Problem mit dem Handel gibt.

Ich fand in der Tutorial-Skript in der Zeit Abschnitt Hilfe fügen Sie bitte den Parameter Nummer des Tages, dh Freitag Aufträge wurden um 21 55 und an normalen Tagen um 23 55 geschlossen oder kann den Link zu teilen, wenn es vorgefertigte Lösungen sind

//--------------------------------------------------------------------
// timeevents.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
extern double Time_Cls=16.10;          // Время закрытия ордеров
bool Flag_Time=false;                  // Флаг, сообщения ещё не было 
//--------------------------------------------------------------- 2 --
int start()                            // Спец. функция start
  {
   int    Cur_Hour=Hour();             // Серверное время в часах
   double Cur_Min =Minute();           // Серверное время в минутах
   double Cur_time=Cur_Hour + Cur_Min100; // Текущее время
   Alert(Cur_time);
   if (Cur_time>=Time_Cls)             // Если наступило время события
      Executor();                      //.. то выполняем задуманное
   return;                             // Выход из start()
  }
//--------------------------------------------------------------- 3 --
int Executor()                         // Пользовательская функция
  {
   if (Flag_Time==false)               // Если ещё не было сообщения..
     {                                 // .. то сообщаем (1 раз)
      Alert("Время важных новостей. Закройте ордера.");
      Flag_Time=true;                  // Теперь сообщение уже было
     }
   return;                             // Выход из польз. функции
  }

//--------------------------------------------------------------- 4 --

 
r772ra:
Vorsicht!!!


Danke. Aber haben Sie eine Ahnung davon? Ich brauche nur Informationen für 1 Tag. Das ist die Anzeige der Gewinninformationen für den letzten Arbeitstag

Variablen werden deklariert. Das funktioniert nicht. Es sind alles Nullen.

for (p=0; p<OrdersHistoryTotal(); p++) {

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {

if (StrToTime(TimeToStr(TimeCurrent(), TIME_DATE))<OrderCloseTime() && (OrderType()==OP_BUY || OrderType()==OP_SELL) )

p0+=OrderProfit()+OrderCommission()+OrderSwap();

}

}

double r0=p0*100/AccountBalance();

 
Zolotai:


Danke. Aber können Sie mir einen Tipp geben? Ich brauche nur Informationen für 1 Tag. Das heißt, um die Gewinninformationen für den letzten Arbeitstag anzuzeigen

Variablen werden deklariert. Das funktioniert nicht. Es ist alles nichtig.

for (p=0; p<OrdersHistoryTotal(); p++) {

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {

if (StrToTime(TimeToStr(TimeCurrent(), TIME_DATE))<OrderCloseTime() && (OrderType()==OP_BUY || OrderType()==OP_SELL) )

p0+=OrderProfit()+OrderCommission()+OrderSwap();

}

}

double r0=p0*100/AccountBalance();


Dieser Expert Advisor verfügt über die MM_Light-Bibliothek und die darin enthaltene Funktion:

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Считаем итоги работы по своим ордерам                                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fCalculate_Pribul (int fi_OP = -2,              // тип (BUY\SELL) учитываемых ордеров
                          datetime fdt_TimeBegin = 0,  // момент времени, с которого производим расчёт
                          string fs_Comment = "")      // комментарий ордеров
{
    double   ld_Pribul = 0.0;
    int      history_total = OrdersHistoryTotal();
//----
    for (int li_ORD = 0; li_ORD < history_total; li_ORD++)
    {
        if (!fCheck_MyOrders (li_ORD, fi_OP, MODE_HISTORY)) continue;
        if (fdt_TimeBegin > OrderCloseTime()) continue;
        if (fs_Comment != "") {if (StringFind (OrderComment(), fs_Comment) < 0) continue;}
        ld_Pribul += (OrderProfit() + OrderSwap() + OrderCommission());
    }
//----
    return (ld_Pribul);
}
Das Prinzip ist leicht zu verstehen. Um den Gewinn/Verlust für den aktuellen Tag zu berechnen, müssen Sie den folgenden Wert übergeben: fCalculate_Pribul (-2, iTime (Symbol(), PERIOD_D1, 0), "").
 
sannin:

Guten Tag, bitte helfen Sie mir.

Alle Aufträge müssen um 23.55 Uhr geschlossen werden, und am Freitag endet der Handel um 22.00 Uhr, so dass es ein Problem mit dem Handel gibt.

Ich fand in der Tutorial-Skript in der Zeit Abschnitt Hilfe fügen Sie bitte den Parameter Nummer des Tages, dh Freitag Aufträge wurden um 21 55 und an normalen Tagen um 23 55 geschlossen oder kann den Link zu teilen, wenn es vorgefertigte Lösungen sind

//--------------------------------------------------------------- 4 --

Natürlich wurde der Code von Grund auf neu geschrieben, aber er sollte funktionieren, zumindest sollte man ihn verstehen

int start() {
switch(DayOfWeek()){// если пятница,суббота, и т.д.
 case 4://пятница
 case 5://суббота на всякий случай
 case 6://воскресенье на всякий случай
             if((Hour()==22 && Minute()>=00) || Hour()>22){
                 //   Выполняем какое то действие  в пятницу после 22:00
             }
             break;
 case 0://понедельник
 case 1://вторник
 case 2://среда
 case 3://четверг
             if(Hour()>23 || (Hour()==23 && Minute()>55)){
                // все остальные действия в нормальные рабочии дни ПОСЛЕ 23:55
             }
              break;
  default:   {//все остальные действия в нормальные рабочии дни до 23:55
  
             }
 }                   
}
 
SetIndexStyle(1,DRAW_LINE,STYLE_DASH,0);
Wo ist in diesem Teil die Dicke der Linie angegeben? Es war mir sogar peinlich. :(
 
Link_x:
Wo ist in diesem Teil die Dicke der Linie angegeben? Es war mir sogar peinlich. :(
Der letzte Parameter.