Non, cela signifie seulement que les données correspondent à un morceau d'histoire.
Vous auriez pu le saisir manuellement, par exemple. Ou écrit à partir d'un fichier texte. Ou vous pourriez l'avoir obtenu par un calcul.
Parce que même en entrant des données conditionnelles "1,25 1,16 1,73 1,35", nous pouvons obtenir l'historique d'une monnaie il y a plusieurs années. Mais cela ne signifie pas que nous avons mis en place un tableau chronologique.
J'ai un peu modifié le script original :
1. J'ai copié seulement 5 derniers prix d'ouverture dans le tableau personnalisé.
2. Calculer le tableau personnalisé obtenu par les 5 prix d'ouverture copiés.
/+------------------------------------------------------------------------------------------+
//| ArrayGetAsSeries_плюс.mq4 |//+------------------------------------------------------------------------------------------+//| script program start function |//+------------------------------------------------------------------------------------------+//------------------------------------ НАЧАЛО START -------------------------------------- 1 -int start() //функция start
{ //начало startdouble Timestart=GetTickCount(); //переменная, с помощью которой вычисляется время (в милисекундах) начала выполнения эксперта double array1[]; //объявляем массив-приемник (массив, куда будут скопированы данные)int element=ArrayCopy(array1,Open,0,0,5); //копируем данные по максимальным ценам в пользовательский массив (начиная с 1-о бара, а не с нулевого)int size=ArraySize(array1); //устанавливаем количество элементов массива array1//----------------------------------------------------------------------------------------- 2 -Comment("\nФункция ArrayCopy(array1[],Open,0,0,WHOLE_ARRAY) вернула: ",element,
"\nФункция ArraySize(array1) вернула: ",size,
"\nЗначение цены открытия бара №0 равно ",array1[0],"; Время цены открытия бара №0: ",TimeToStr(iTime(NULL,0,0),TIME_DATE|TIME_MINUTES),
"\nЗначение цены открытия бара №1 равно ",array1[1],"; Время цены открытия бара №1: ",TimeToStr(iTime(NULL,0,1),TIME_DATE|TIME_MINUTES),
"\nЗначение цены открытия бара №2 равно ",array1[2],"; Время цены открытия бара №2: ",TimeToStr(iTime(NULL,0,2),TIME_DATE|TIME_MINUTES),
"\nЗначение цены открытия бара №3 равно ",array1[3],"; Время цены открытия бара №3: ",TimeToStr(iTime(NULL,0,3),TIME_DATE|TIME_MINUTES),
"\nЗначение цены открытия бара №4 равно ",array1[4],"; Время цены открытия бара №4: ",TimeToStr(iTime(NULL,0,4),TIME_DATE|TIME_MINUTES),
"\nФункция ArrayGetAsSeries(array1) вернула: ",ArrayGetAsSeries(array1),
"\nСкрипт выполнялся всего ",GetTickCount()-Timestart," миллисекунд, из них: ",MathFloor((GetTickCount()-Timestart)/1000),
" секунд ",((GetTickCount()-Timestart)/1000-MathFloor((GetTickCount()-Timestart)/1000))*1000," миллисекунд");//печать //сообщения на экран//----------------------------------------------------------------------------------------- 3 -return(0); //выход из start
} //конец start//-------------------------------------- КОНЕЦ START -------------------------------------- 4 -
Voici ce que j'ai obtenu :
Comme vous pouvez le voir sur la figure, les prix ouverts sont indexés dans l'ordre inverse (comme en témoignent le NOMBRE de prix ouverts en barre (dans l'ordre croissant) et le TEMPS de prix ouverts en barre (dans l'ordre décroissant)), c'est-à-dire que le tableau est organisé comme un tableau-série temporelle.
Mais la fonction ArrayGetAsSeries renvoie néanmoins 0 (faux), ce qui signifie : le tableau utilisateur n'est PAS organisé comme un tableau-temps.
1. J'ai copié seulement les 5 derniers prix d'ouverture dans un tableau personnalisé.
2. Ras a traité le tableau personnalisé résultant par les 5 prix d'ouverture copiés.
Voici ce que j'ai obtenu :
Comme vous pouvez le voir sur la figure, les prix ouverts sont indexés dans l'ordre inverse (comme en témoignent le NOMBRE de prix ouverts en barre (dans l'ordre croissant) et le TEMPS de prix ouverts en barre (dans l'ordre décroissant)), c'est-à-dire que le tableau est organisé comme un tableau-série temporelle.
Mais la fonction ArrayGetAsSeries renvoie néanmoins 0 (faux), ce qui signifie : le tableau utilisateur n'est PAS organisé comme un tableau-temps.
Veuillez préciser
Question: comment l'expliquer ?
P.S. Merci d'avoir répondu à mes questions.
Avez-vous essayé d'utiliser le
boolArraySetAsSeries(
void array[], bool set)
Définit la direction d'indexation d'un tableau. Unensemble VRAI définit la direction de l'indexation dans l'ordre inverse, c'est-à-dire que le dernier élément a un indice de zéro. Une valeur de FALSE définit la direction normale d'indexation. La fonction renvoie l'état précédent.
Définit la direction d'indexation du tableau. Unevaleur deset TRUE définit la direction de l'indexation dans l'ordre inverse, c'est-à-dire que le dernier élément a un indice de zéro. Une valeur de FALSE définit la direction normale d'indexation. La fonction retourne l'état précédent.
Paramètres :
tableau[]
-
Tableau numérique à définir.
set
-
La direction dans laquelle le tableau est indexé.
Mon objectif à ce stade est de comprendre le fonctionnement d'une fonction particulière, et dans ce cas précis, le fonctionnement de la fonction ArrayGetAsSeries. J'ai cru comprendre que je pouvais utiliser la fonction ArraySetAsSeries avec le paramètre set=true, qui définit de manière forcée l'indexation, comme dans array-timeseries. Mais je veux comprendre pourquoi, dans mon cas, la fonction ArrayGetAsSeries renvoie 0, alors que le tableau ressemble à une série chronologique (c'est-à-dire qu'il est indexé comme une série chronologique).
Peut-être que quelque chose ne va pas avec i_maShiftByPrice ???
Il est difficile d'être plus précis.
Les informations qu'il produit ne sont pas correctes. Voici le code complet :
#property copyright "hoz"#property link ""#include <stderror.mqh>#include <stdlib.mqh>externstring h1 = "основные параметры машки";
externint i_maTF = 0;
externint i_maPeriod = 50;
externint i_maShiftByPrice = 0;
externint i_maMethod = 0;
externint i_maPrice = 0;
externint i_shiftBarsBack1 = 1; // Первое значение shiftexternint i_shiftBarsBack2 = 49; // Второе значение shiftexternstring h2 = "===============================";
string h3 = "Значения цены и времени в точках А и В гипотенузы";
double price1, // Цена в точке А
price2, // Цена в точке В
time1, // Время в точке А
time2, // Время в точке Вstring h4 = "Переменые массивов цены и времени в точках А и В гипотенузы";
double varsPrice1[100], // Буфер для цены в точке А
varsPrice2[100], // Буфер для цены в точке В
varsTime1[100], // Буфер для времени в точке А
varsTime2[100], // Буфер для времени в точке В#property indicator_separate_window#property indicator_buffers 5#property indicator_color1 Red//+------------------------------------------------------------------+//| Функция инициализации индикатора |//+------------------------------------------------------------------+int init()
{
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
SetIndexBuffer(0,varsAngle); // Связываем массив значений угла с буферомSetIndexStyle(0,DRAW_HISTOGRAM);
// -------------- блок инициализации закончен ----------------------return(0);
}
//+------------------------------------------------------------------+//| Функция деинициализации индикатора |//+------------------------------------------------------------------+int deinit()
{
// -------------- блок деинициализации закончен ----------------------return(0);
}
//+------------------------------------------------------------------+//| Функция итерации эксперта |//+------------------------------------------------------------------+int start()
{
int i, countedBars = IndicatorCounted();
int limit = Bars - countedBars;
if (limit > 100) limit = 100;
for(i = limit - 1;i > 0;i--)
{
price1 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack1+i); // Цена в точке А
price2 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack2+i); // Цена в точке В
time1 = iTime(Symbol(),Period(),i_shiftBarsBack1 + i - 1); // Время в точке А
time2 = iTime(Symbol(),Period(),i_shiftBarsBack2 + i - 1); // Время в точке ВPrint("i = ", i," i_maTF = ", i_maTF, " i_maPeriod = ", i_maPeriod," i_maShiftByPrice ", i_maShiftByPrice, " i_maMethod = ", i_maMethod," i_maPrice = ", i_maPrice, " i_shiftBarsBack1 = ", i_shiftBarsBack1);
string error = GetMyLastError2();
// Print("vars", DoubleToStr(price1,5));// Print("vars", DoubleToStr(varsPrice1[i],5));
varsPrice1[i] = price1; // Массив цен в точке А
varsPrice2[i] = price2; // Массив цен в точке В
varsTime1[i] = time1; // Массив времени в точке А
varsTime2[i] = time2; // Массив времени в точке В// Print("vars", DoubleToStr(varsPrice1[i],5));double d = (MathAbs(varsTime1[i] - varsTime2[i]))*1.0;
double h = (MathAbs(varsPrice1[i] - varsPrice2[i]));
// Print("d = ", d, " h = ", h);double angle = h/d;
varsAngle[i] = angle;
}
return(0);
}
string GetMyLastError2()
{
int err = GetLastError();
string serr = ErrorDescription(err);
return(serr);
}
/* //+------------------------------------------------------------------+
//| Функция рассчёта тангенса угла |
//+------------------------------------------------------------------+
double TanA(double d, double h)
{
double angle = h/d;
return(0);
}
// -------------- блок деинициализации закончен ---------------------- */
Sort les mauvaises informations. Voici le code complet :
Le journal de l'expert montre ceci :
Comme vous pouvez le constater, les variables i_maTF, i_maPeriod et i_maPrice ne sont pas les mêmes que celles que j'ai initialisées. Qu'est-ce qu'il y a ?
Je me demande comment vous avez réussi à obtenir quelque chose dans le journal si le code que vous avez soumis ne compile pas ?
Ah, si vous le compilez, il n'y aura pas de bizarrerie.
Je me demande comment vous avez réussi à obtenir quelque chose dans le journal si le code que vous avez présenté ne compile pas ?
Ah, si vous le compilez, vous n'aurez pas de bizarreries.
Je compile toujours normalement.
J'ai nettoyé le code des imprimantes et variables supplémentaires afin de ne pas embrouiller les gens. Mais je ne les ai pas supprimés ci-dessous, donc ça n'a pas compilé. Voici le code complet qui se compile :
//+------------------------------------------------------------------+//| AngleByTg.mq4 |//| hoz |//| |//+------------------------------------------------------------------+#property copyright "hoz"#property link ""#include <stderror.mqh>#include <stdlib.mqh>externstring h1 = "основные параметры машки";
externint i_maTF = 0;
externint i_maPeriod = 50;
externint i_maShiftByPrice = 0;
externint i_maMethod = 0;
externint i_maPrice = 0;
externint i_shiftBarsBack1 = 1; // Первое значение shiftexternint i_shiftBarsBack2 = 49; // Второе значение shiftexternstring h2 = "===============================";
string h3 = "Значения цены и времени в точках А и В гипотенузы";
double price1, // Цена в точке А
price2, // Цена в точке В
time1, // Время в точке А
time2, // Время в точке В
angle; // Значение возвращаемой тангенсомstring h4 = "Переменые массивов цены и времени в точках А и В гипотенузы";
double varsPrice1[100], // Буфер для цены в точке А
varsPrice2[100], // Буфер для цены в точке В
varsTime1[100], // Буфер для времени в точке А
varsTime2[100], // Буфер для времени в точке В
varsAngle[100]; // Буфер для хранения значение угла#property indicator_separate_window#property indicator_buffers 5#property indicator_color1 Red//#property indicator_minimum -90//#property indicator_maximum 90//+------------------------------------------------------------------+//| Функция инициализации индикатора |//+------------------------------------------------------------------+int init()
{
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
SetIndexBuffer(0,varsAngle); // Связываем массив значений угла с буферомSetIndexStyle(0,DRAW_HISTOGRAM);
// -------------- блок инициализации закончен ----------------------return(0);
}
//+------------------------------------------------------------------+//| Функция деинициализации индикатора |//+------------------------------------------------------------------+int deinit()
{
// -------------- блок деинициализации закончен ----------------------return(0);
}
//+------------------------------------------------------------------+//| Функция итерации эксперта |//+------------------------------------------------------------------+int start()
{
// if (!isNewBar())// return(0);int i, countedBars = IndicatorCounted();
int limit = Bars - countedBars;
if (limit > 100) limit = 100;
for(i = limit - 1;i > 0;i--)
{
price1 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack1+i); // Цена в точке А
price2 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack2+i); // Цена в точке В
time1 = iTime(Symbol(),Period(),i_shiftBarsBack1 + i - 1); // Время в точке А
time2 = iTime(Symbol(),Period(),i_shiftBarsBack2 + i - 1); // Время в точке ВPrint("i = ", i," i_maTF = ", i_maTF, " i_maPeriod = ", i_maPeriod," i_maShiftByPrice ", i_maShiftByPrice, " i_maMethod = ", i_maMethod," i_maPrice = ", i_maPrice, " i_shiftBarsBack1 = ", i_shiftBarsBack1);
string error = GetMyLastError2();
// Print("i = ", i," time1 = ", time1, " price1 = ", price1);// Print("vars", DoubleToStr(price1,5));// Print("vars", DoubleToStr(varsPrice1[i],5));
varsPrice1[i] = price1; // Массив цен в точке А
varsPrice2[i] = price2; // Массив цен в точке В
varsTime1[i] = time1; // Массив времени в точке А
varsTime2[i] = time2; // Массив времени в точке В// Print("vars", DoubleToStr(varsPrice1[i],5));//Print("i = ", i," time1 = ", time1, " price1 = ", price1);// Print("i = ", i," time2 = ", time2, " price2 = ", price2);// Print("i = ", i," varsTime1[i] = ", varsTime1[i], " varsPrice1[i] = ", varsPrice1[i]);// Print("i = ", i," varsTime2[i] = ", varsTime2[i], " varsPrice2[i] = ", varsPrice2[i]);double d = (MathAbs(varsTime1[i] - varsTime2[i]))*1.0;
double h = (MathAbs(varsPrice1[i] - varsPrice2[i]));
// Print("d = ", d, " h = ", h);double angle = h/d;
varsAngle[i] = angle;
// Print("i = ", i," varsAngle[i] = ", varsAngle[i]);
}
return(0);
}
string GetMyLastError2()
{
int err = GetLastError();
string serr = ErrorDescription(err);
return(serr);
}
/* //+------------------------------------------------------------------+
//| Функция рассчёта тангенса угла |
//+------------------------------------------------------------------+
double TanA(double d, double h)
{
double angle = h/d;
return(0);
}
// -------------- блок деинициализации закончен ---------------------- */
Aidez-moi ! Comment faire pour qu'un EA ferme un ancien ordre lorsqu'il en ouvre un nouveau ? Dans le testeur de stratégie, cela fonctionne bien, mais sur le compte réel, pour une raison quelconque, lorsque j'en ouvre un nouveau, l'ancien quitte ????????. Je suis un zéro total en programmation(((
//---- input parameters //ooooooooooooooooooooooooooooooooooooooooooooooooo extern bool In_BUY=true; extern int SL_buy=62; //---входные параметры по лонгам extern int Risk_buy=0; //ooooooooooooooooooooooooooooooooooooooooooooooooo extern bool In_SELL=true; extern int SL_sell=62; //---входные параметры по шортам extern int Risk_sell=0; //ooooooooooooooooooooooooooooooooooooooooooooooooo
//---- other parameters static int prevtime=0; int ticket=0; int x=1; //---------------------------------------------- int Magic_BUY =123; int Magic_SELL =321;
//+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- if(Digits == 5) x=10; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //----
//---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //oooooooooooooooooooooooooooooooooooooooooooooooooooo if (Time[0] == prevtime) return(0); prevtime = Time[0]; if (!IsTradeAllowed()) { prevtime=Time[1]; MathSrand(TimeCurrent());Sleep(30000 + MathRand()); //--- формировка бара--- } //ooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
Trade( Magic_BUY, In_BUY,Ask,0,2, SL_buy, Risk_buy); //---торговля по лонгам
Trade(Magic_SELL,In_SELL,Bid,2,0, SL_sell,Risk_sell); //---торговля по шортам
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx double lot(int R) { if (R<0)R=0; if (R>80)R=80; //------корректность ввода ------- double minlot = MarketInfo(Symbol(), MODE_MINLOT); int o = MathAbs(MathLog(minlot) *0.4343) + 0.5; double lot = minlot; //ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo lot = NormalizeDouble(AccountFreeMargin() * 0.00001*R, o);//--- if (AccountFreeMargin() < lot * MarketInfo(Symbol(), MODE_MARGINREQUIRED)) { lot = NormalizeDouble(AccountFreeMargin() / MarketInfo(Symbol(), MODE_MARGINREQUIRED), o); } //ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo if(lot < minlot) lot = minlot; double maxlot =MarketInfo(Symbol(), MODE_MAXLOT); if(lot > maxlot) lot = maxlot; return(lot); } //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_end_film_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Ou peut-être écrire un autre EA qui fonctionnerait sur le principe de 1 a ouvert, 2 a ouvert-1 a fermé, 3Ouvré-2 a fermé, etc. L'aide est vraiment, vraiment nécessaire ! !!
Aidez-moi ! Comment faire pour qu'un EA ferme un ancien ordre lorsqu'il en ouvre un nouveau ? Dans le testeur de stratégie, cela fonctionne bien, mais sur le compte réel, pour une raison quelconque, lorsque j'en ouvre un nouveau, l'ancien quitte ? ???????. Je n'ai pas la moindre idée de la programmation(( !)
//---- input parameters //ooooooooooooooooooooooooooooooooooooooooooooooooo extern bool In_BUY=true; extern int SL_buy=62; //---входные параметры по лонгам extern int Risk_buy=0;
7777877: À ce stade, mon objectif est de comprendre comment fonctionne telle ou telle fonction et, dans ce cas précis, comment fonctionne la fonction ArrayGetAsSeries. J'ai cru comprendre que vous pouvez utiliser la fonction ArraySetAsSeries avec le paramètre set=true, qui définit de manière forcée l'indexation, comme dans array-timeseries. Mais je veux comprendre pourquoi, dans mon cas, la fonction ArrayGetAsSeries renvoie 0, alors que le tableau ressemble à une série chronologique (c'est-à-dire qu'il est indexé comme une série chronologique).
Précisément parce qu'il ne s'agit que d'une série chronologique.
Ce n'est que votre opinion personnelle. Et si vous y mettez les chiffres 1, 2, 1.2, 2.1, vous obtenez une série chronologique pour le porc à partir de 1927 (les chiffres sont conditionnels). Mais cela ne fait pas du tableau une série temporelle - vous devez le spécifier explicitement avec la fonction
Je comprends que je ne veuille pas spéculer, mais pouvez-vous au moins me donner un indice si le problème est clair pour vous ?
Donnez-moi tout le code
Non, cela signifie seulement que les données correspondent à un morceau d'histoire.
Vous auriez pu le saisir manuellement, par exemple. Ou écrit à partir d'un fichier texte. Ou vous pourriez l'avoir obtenu par un calcul.
Parce que même en entrant des données conditionnelles "1,25 1,16 1,73 1,35", nous pouvons obtenir l'historique d'une monnaie il y a plusieurs années. Mais cela ne signifie pas que nous avons mis en place un tableau chronologique.
J'ai un peu modifié le script original :
1. J'ai copié seulement 5 derniers prix d'ouverture dans le tableau personnalisé.
2. Calculer le tableau personnalisé obtenu par les 5 prix d'ouverture copiés.
Voici ce que j'ai obtenu :
Comme vous pouvez le voir sur la figure, les prix ouverts sont indexés dans l'ordre inverse (comme en témoignent le NOMBRE de prix ouverts en barre (dans l'ordre croissant) et le TEMPS de prix ouverts en barre (dans l'ordre décroissant)), c'est-à-dire que le tableau est organisé comme un tableau-série temporelle.
Mais la fonction ArrayGetAsSeries renvoie néanmoins 0 (faux), ce qui signifie : le tableau utilisateur n'est PAS organisé comme un tableau-temps.
Demande de clarté très aimable
Question: comment expliquer cela ?
P.S. Merci d'avoir répondu à mes questions.
J'ai un peu modifié le script original :
1. J'ai copié seulement les 5 derniers prix d'ouverture dans un tableau personnalisé.
2. Ras a traité le tableau personnalisé résultant par les 5 prix d'ouverture copiés.
Voici ce que j'ai obtenu :
Comme vous pouvez le voir sur la figure, les prix ouverts sont indexés dans l'ordre inverse (comme en témoignent le NOMBRE de prix ouverts en barre (dans l'ordre croissant) et le TEMPS de prix ouverts en barre (dans l'ordre décroissant)), c'est-à-dire que le tableau est organisé comme un tableau-série temporelle.
Mais la fonction ArrayGetAsSeries renvoie néanmoins 0 (faux), ce qui signifie : le tableau utilisateur n'est PAS organisé comme un tableau-temps.
Veuillez préciser
Question: comment l'expliquer ?
P.S. Merci d'avoir répondu à mes questions.
Avez-vous essayé d'utiliser le
Avez-vous essayé les fonctions
i_maTF == Période() ? ?????
i_maPeriod prend une valeur raisonnable ???
Peut-être que quelque chose ne va pas avec i_maShiftByPrice ???
Il est difficile d'être plus précis.
Les informations qu'il produit ne sont pas correctes. Voici le code complet :
Le journal du conseiller expert montre ceci :
Comme vous pouvez le voir, les variables i_maTF, i_maPeriod et i_maPrice ne sont pas celles que j'ai initialisées. Qu'est-ce qu'il y a ?
Sort les mauvaises informations. Voici le code complet :
Le journal de l'expert montre ceci :
Comme vous pouvez le constater, les variables i_maTF, i_maPeriod et i_maPrice ne sont pas les mêmes que celles que j'ai initialisées. Qu'est-ce qu'il y a ?
Je me demande comment vous avez réussi à obtenir quelque chose dans le journal si le code que vous avez soumis ne compile pas ?
Ah, si vous le compilez, il n'y aura pas de bizarrerie.
Je me demande comment vous avez réussi à obtenir quelque chose dans le journal si le code que vous avez présenté ne compile pas ?
Ah, si vous le compilez, vous n'aurez pas de bizarreries.
Je compile toujours normalement.
J'ai nettoyé le code des imprimantes et variables supplémentaires afin de ne pas embrouiller les gens. Mais je ne les ai pas supprimés ci-dessous, donc ça n'a pas compilé. Voici le code complet qui se compile :
Aidez-moi ! Comment faire pour qu'un EA ferme un ancien ordre lorsqu'il en ouvre un nouveau ? Dans le testeur de stratégie, cela fonctionne bien, mais sur le compte réel, pour une raison quelconque, lorsque j'en ouvre un nouveau, l'ancien quitte ????????. Je suis un zéro total en programmation(((
//ooooooooooooooooooooooooooooooooooooooooooooooooo
extern bool In_BUY=true;
extern int SL_buy=62; //---входные параметры по лонгам
extern int Risk_buy=0;
//ooooooooooooooooooooooooooooooooooooooooooooooooo
extern bool In_SELL=true;
extern int SL_sell=62; //---входные параметры по шортам
extern int Risk_sell=0;
//ooooooooooooooooooooooooooooooooooooooooooooooooo
//---- other parameters
static int prevtime=0;
int ticket=0;
int x=1;
//----------------------------------------------
int Magic_BUY =123;
int Magic_SELL =321;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
if(Digits == 5) x=10;
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//oooooooooooooooooooooooooooooooooooooooooooooooooooo
if (Time[0] == prevtime) return(0);
prevtime = Time[0];
if (!IsTradeAllowed()) {
prevtime=Time[1]; MathSrand(TimeCurrent());Sleep(30000 + MathRand()); //--- формировка бара---
}
//ooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
Trade( Magic_BUY, In_BUY,Ask,0,2, SL_buy, Risk_buy); //---торговля по лонгам
Trade(Magic_SELL,In_SELL,Bid,2,0, SL_sell,Risk_sell); //---торговля по шортам
//ooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
return(0);//-----------выход из стартовой функции------------
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void Trade(int mn,bool flag,double price,int period_1,int period_2,int sl,int Risk) {
int total=OrdersTotal();
for (int i = 0; i < total; i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES);//---проход по ордерам--
if (OrderSymbol() == Symbol() && OrderMagicNumber() == mn) {
if(Open[period_2]>Open[period_1]) { //----условие закрытия ордера---------
OrderClose(OrderTicket(),OrderLots(),price,5*x); RefreshRates();
}
return(0);
}
}
//ooooooooooooooooooooooooooooooooooooooooooooooooooo
ticket = -1;
if ( flag &&
Open[period_1]>Open[period_2] && //----вход в рынок по условию---
OrdersTotal()<2 && //-----ограничения чемпионата------
AccountEquity()>200 &&
IsTradeAllowed()) {
if (mn<200) {
ticket= OrderSend(Symbol(), OP_BUY,lot(Risk_buy),Ask,5,Bid-x*sl*Point,0,DoubleToStr(mn,0),mn,0,Blue);
}
else {
ticket= OrderSend(Symbol(),OP_SELL,lot(Risk_sell),Bid,5,Ask+x*sl*Point,0,DoubleToStr(mn,0),mn,0, Red);
}
RefreshRates();
if ( ticket < 0) { Sleep(30000); prevtime = Time[1]; }
} //-- Exit ---
return(0); }
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
double lot(int R) { if (R<0)R=0; if (R>80)R=80; //------корректность ввода -------
double minlot = MarketInfo(Symbol(), MODE_MINLOT);
int o = MathAbs(MathLog(minlot) *0.4343) + 0.5;
double lot = minlot;
//ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
lot = NormalizeDouble(AccountFreeMargin() * 0.00001*R, o);//---
if (AccountFreeMargin() < lot * MarketInfo(Symbol(), MODE_MARGINREQUIRED)) {
lot = NormalizeDouble(AccountFreeMargin() / MarketInfo(Symbol(), MODE_MARGINREQUIRED), o);
}
//ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
if(lot < minlot) lot = minlot;
double maxlot =MarketInfo(Symbol(), MODE_MAXLOT);
if(lot > maxlot) lot = maxlot;
return(lot); }
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_end_film_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Ou peut-être écrire un autre EA qui fonctionnerait sur le principe de 1 a ouvert, 2 a ouvert-1 a fermé, 3Ouvré-2 a fermé, etc. L'aide est vraiment, vraiment nécessaire ! !!
Aidez-moi ! Comment faire pour qu'un EA ferme un ancien ordre lorsqu'il en ouvre un nouveau ? Dans le testeur de stratégie, cela fonctionne bien, mais sur le compte réel, pour une raison quelconque, lorsque j'en ouvre un nouveau, l'ancien quitte ? ???????. Je n'ai pas la moindre idée de la programmation(( !)
//ooooooooooooooooooooooooooooooooooooooooooooooooo
extern bool In_BUY=true;
extern int SL_buy=62; //---входные параметры по лонгам
extern int Risk_buy=0;
Remplacer
à
À ce stade, mon objectif est de comprendre comment fonctionne telle ou telle fonction et, dans ce cas précis, comment fonctionne la fonction ArrayGetAsSeries. J'ai cru comprendre que vous pouvez utiliser la fonction ArraySetAsSeries avec le paramètre set=true, qui définit de manière forcée l'indexation, comme dans array-timeseries. Mais je veux comprendre pourquoi, dans mon cas, la fonction ArrayGetAsSeries renvoie 0, alors que le tableau ressemble à une série chronologique (c'est-à-dire qu'il est indexé comme une série chronologique).
Précisément parce qu'il ne s'agit que d'une série chronologique.
Ce n'est que votre opinion personnelle. Et si vous y mettez les chiffres 1, 2, 1.2, 2.1, vous obtenez une série chronologique pour le porc à partir de 1927 (les chiffres sont conditionnels). Mais cela ne fait pas du tableau une série temporelle - vous devez le spécifier explicitement avec la fonction