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(){
staticint a = 12;
return;
}
In welchem Fall wird sich der Unterschied bemerkbar machen? ALXIMIKS, auch Ihnen vielen Dank für Ihre Antwort.
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?
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_buffers1#property indicator_color1 Red
//--- input parameters//--- buffersdouble ExtMapBuffer1[];
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+int init()
{
//---- indicatorsSetIndexStyle(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;
staticdouble MA_otshet; //здесь хранится запись значения MA_otshetfor(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_otshetif(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);
}
//+------------------------------------------------------------------+
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 --externdoubleTime_Cls=16.10; // Время закрытия ордеровboolFlag_Time=false; // Флаг, сообщения ещё не было //--------------------------------------------------------------- 2 --intstart()// Спец. функция start{intCur_Hour=Hour(); // Серверное время в часахdoubleCur_Min =Minute(); // Серверное время в минутахdoubleCur_time=Cur_Hour + Cur_Min100; // Текущее времяAlert(Cur_time);
if(Cur_time>=Time_Cls)// Если наступило время событияExecutor(); //.. то выполняем задуманноеreturn; // Выход из start()}//--------------------------------------------------------------- 3 --intExecutor()// Пользовательская функция{if(Flag_Time==false)// Если ещё не было сообщения..{// .. то сообщаем (1 раз)Alert("Время важных новостей. Закройте ордера.");
Flag_Time=true; // Теперь сообщение уже было}return; // Выход из польз. функции}
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) )
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), "").
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
Natürlich wurde der Code von Grund auf neu geschrieben, aber er sollte funktionieren, zumindest sollte man ihn verstehen
int start() {
switch(DayOfWeek()){// если пятница,суббота, и т.д.case4://пятницаcase5://суббота на всякий случайcase6://воскресенье на всякий случайif((Hour()==22 && Minute()>=00) || Hour()>22){
// Выполняем какое то действие в пятницу после 22:00
}
break;
case0://понедельникcase1://вторникcase2://средаcase3://четвергif(Hour()>23 || (Hour()==23 && Minute()>55)){
// все остальные действия в нормальные рабочии дни ПОСЛЕ 23:55
}
break;
default: {//все остальные действия в нормальные рабочии дни до 23:55
}
}
}
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.
Es ist sinnvoll, Statiken innerhalb von Funktionen zu deklarieren. Der Bereich ist nur ein Funktionsblock.
Es funktioniert auf die gleiche Weise:
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.
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 --
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();
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();
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), "").
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
Wo ist in diesem Teil die Dicke der Linie angegeben? Es war mir sogar peinlich. :(