J'ai une question enfantine. Les variables sont déclarées dans l'en-tête du code. Ils sont censés être mondiaux. Mais je ne comprends pas la différence
de
si cette variable est déclarée dans l'en-tête. Idéalement, par la portée de la variable. Mais dans les deux cas, il est visible à l'intérieur de la fonction. J'ai fait un test (script) :
- Je n'ai pas remarqué de différences. Pouvez-vous expliquer leur différence, car je ne la comprends pas.
Il y a un statik supplémentaire là-dedans. Il fonctionnera également sans lui. Il est logique de déclarer les statiques à l'intérieur des fonctions. La portée du bloc fonctionnel uniquement.
Zhunko: Il est logique de déclarer les statiques à l'intérieur des fonctions. L'étendue n'est qu'un bloc fonctionnel.
Cela fonctionne de la même manière :
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;
}
Dans quel cas la différence se fera-t-elle sentir ? ALXIMIKS, merci aussi pour la réponse.
Pouvez-vous me dire comment installer un indicateur/robot supplémentaire sur un mt4 installé sur un iphone/ipad ? Est-ce en principe possible ? Avec Windows, c'est simple et élémentaire, mais avec les produits mobiles d'Apple, ce n'est pas si évident.
La logique dit que c'est possible. Après tout, un certain nombre d'indicateurs sont déjà préinstallés. Mais ce qui et où copier n'est pas clair, la structure du fichier est différente. Quelqu'un n'a-t-il pas rencontré un tel problème ?
Je suis en train de créer un indicateur basé sur les moyennes mobiles. L'idée est de couper les mouvements insignifiants dans des points précis. Disons que nous avons défini un filtre de 50 pips. L'indicateur est en baisse mais la baisse est inférieure à 50 pips, donc nous prenons la valeur de la moyenne d'hier et l'écrivons et fixons son niveau pour la date actuelle. Sur la barre suivante, nous vérifions la différence, la valeur actuelle moins la valeur que nous avons enregistrée, si le total ne dépasse pas 50 pips, nous fixons le niveau qui est stocké dans la variable statique à la valeur actuelle. Si la valeur la dépasse, elle devient la valeur actuelle, c'est-à-dire qu'elle est similaire à une moyenne mobile avec un décalage de zéro.J'ai essayé différentes variantes, mais je n'ai pas encore trouvé la bonne solution.
Pour des raisons de simplicité, je joins le code pour dessiner uniquement les déclins. Le problème est que l'indicateur tire à la hausse. Et la principale est que lorsque je l'exécute dans le testeur, je peux voir visuellement l'indicateur changer, alors qu'il n'y a pas de sortie en dehors du filtre. Je suppose que quelque part la valeur de l'enregistrement "MA_otshet" est perdue.
#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);
}
//+------------------------------------------------------------------+
J'ai besoin que tous les ordres soient fermés à 23 h 55 et le vendredi, la négociation se termine à 22 h. Il y a donc un problème avec la transaction.
j'ai trouvé dans le script du tutoriel dans la section temps l'aide s'il vous plaît ajouter le paramètre numéro du jour, c'est-à-dire vendredi les ordres ont été fermés à 21 55 et les jours normaux à 23 55 ou peut partager le lien s'il ya des solutions prêtes à l'emploi
//--------------------------------------------------------------------// 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; // Выход из польз. функции}
Merci. Mais avez-vous la moindre idée. Je n'ai besoin que d'une journée d'informations. Il s'agit d'afficher les informations sur les bénéfices du dernier jour ouvrable.
Les variables sont déclarées. Ça ne marche pas. Il n'y a que des zéros.
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) )
Merci. Mais, euh, tu peux me donner un indice ? Je n'ai besoin que d'une journée d'informations. C'est-à-dire pour afficher les informations sur les bénéfices du dernier jour ouvrable.
Les variables sont déclarées. Ça ne marche pas. C'est nul.
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();
Ce conseiller expert dispose de la bibliothèque MM_Light et de la fonction correspondante :
//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);
}
Le principe est facile à comprendre. Pour calculer le profit/la perte pour le jour en cours, vous devez lui transmettre la valeur : fCalculate_Pribul (-2, iTime (Symbol(), PERIOD_D1, 0), "").
J'ai besoin que tous les ordres soient fermés à 23 h 55 et le vendredi, la négociation se termine à 22 h. Il y a donc un problème avec la transaction.
j'ai trouvé dans le script du tutoriel dans la section temps l'aide s'il vous plaît ajouter le paramètre numéro du jour, c'est-à-dire vendredi les ordres ont été fermés à 21 55 et les jours normaux à 23 55 ou peut partager le lien s'il ya des solutions prêtes à l'emploi
Bien sûr, le code a été écrit à partir de rien, mais il devrait fonctionner, ou du moins vous devriez le comprendre.
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
}
}
}
J'ai une question enfantine. Les variables sont déclarées dans l'en-tête du code. Ils sont censés être mondiaux. Mais je ne comprends pas la différence
de
si cette variable est déclarée dans l'en-tête. Idéalement, par la portée de la variable. Mais dans les deux cas, il est visible à l'intérieur de la fonction. J'ai fait un test (script) :
- Je n'ai pas remarqué de différences. Pouvez-vous expliquer leur différence, car je ne la comprends pas.
Il est logique de déclarer les statiques à l'intérieur des fonctions. L'étendue n'est qu'un bloc fonctionnel.
Cela fonctionne de la même manière :
Dans quel cas la différence se fera-t-elle sentir ? ALXIMIKS, merci aussi pour la réponse.
Bonjour !
Pouvez-vous me dire comment installer un indicateur/robot supplémentaire sur un mt4 installé sur un iphone/ipad ? Est-ce en principe possible ? Avec Windows, c'est simple et élémentaire, mais avec les produits mobiles d'Apple, ce n'est pas si évident.
La logique dit que c'est possible. Après tout, un certain nombre d'indicateurs sont déjà préinstallés. Mais ce qui et où copier n'est pas clair, la structure du fichier est différente. Quelqu'un n'a-t-il pas rencontré un tel problème ?
Merci d'avance.
Je suis en train de créer un indicateur basé sur les moyennes mobiles . L'idée est de couper les mouvements insignifiants dans des points précis. Disons que nous avons défini un filtre de 50 pips. L'indicateur est en baisse mais la baisse est inférieure à 50 pips, donc nous prenons la valeur de la moyenne d'hier et l'écrivons et fixons son niveau pour la date actuelle. Sur la barre suivante, nous vérifions la différence, la valeur actuelle moins la valeur que nous avons enregistrée, si le total ne dépasse pas 50 pips, nous fixons le niveau qui est stocké dans la variable statique à la valeur actuelle. Si la valeur la dépasse, elle devient la valeur actuelle, c'est-à-dire qu'elle est similaire à une moyenne mobile avec un décalage de zéro.J'ai essayé différentes variantes, mais je n'ai pas encore trouvé la bonne solution.
Pour des raisons de simplicité, je joins le code pour dessiner uniquement les déclins. Le problème est que l'indicateur tire à la hausse. Et la principale est que lorsque je l'exécute dans le testeur, je peux voir visuellement l'indicateur changer, alors qu'il n'y a pas de sortie en dehors du filtre. Je suppose que quelque part la valeur de l'enregistrement "MA_otshet" est perdue.
Bonjour. Aidez-moi, s'il vous plaît.
J'ai besoin que tous les ordres soient fermés à 23 h 55 et le vendredi, la négociation se termine à 22 h. Il y a donc un problème avec la transaction.
j'ai trouvé dans le script du tutoriel dans la section temps l'aide s'il vous plaît ajouter le paramètre numéro du jour, c'est-à-dire vendredi les ordres ont été fermés à 21 55 et les jours normaux à 23 55 ou peut partager le lien s'il ya des solutions prêtes à l'emploi
//--------------------------------------------------------------- 4 --
Facile !!!
Merci. Mais avez-vous la moindre idée. Je n'ai besoin que d'une journée d'informations. Il s'agit d'afficher les informations sur les bénéfices du dernier jour ouvrable.
Les variables sont déclarées. Ça ne marche pas. Il n'y a que des zéros.
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();
Merci. Mais, euh, tu peux me donner un indice ? Je n'ai besoin que d'une journée d'informations. C'est-à-dire pour afficher les informations sur les bénéfices du dernier jour ouvrable.
Les variables sont déclarées. Ça ne marche pas. C'est nul.
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();
Le principe est facile à comprendre. Pour calculer le profit/la perte pour le jour en cours, vous devez lui transmettre la valeur : fCalculate_Pribul (-2, iTime (Symbol(), PERIOD_D1, 0), "").
Bonjour. Aidez-moi, s'il vous plaît.
J'ai besoin que tous les ordres soient fermés à 23 h 55 et le vendredi, la négociation se termine à 22 h. Il y a donc un problème avec la transaction.
j'ai trouvé dans le script du tutoriel dans la section temps l'aide s'il vous plaît ajouter le paramètre numéro du jour, c'est-à-dire vendredi les ordres ont été fermés à 21 55 et les jours normaux à 23 55 ou peut partager le lien s'il ya des solutions prêtes à l'emploi
//--------------------------------------------------------------- 4 --
Bien sûr, le code a été écrit à partir de rien, mais il devrait fonctionner, ou du moins vous devriez le comprendre.
Où cette partie spécifie-t-elle l'épaisseur de la ligne ? J'étais même gêné. :(