[ARCHIVE] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 3. - page 253

 
granit77:
Proposé :

qaz2005 11.10.2011 09:30
Bonjour à tous ! Veuillez me conseiller, il y a un indicateur personnalisé, il a deux objets. Je peux connaître leurs valeurs, mais il n'y a aucun moyen de les distinguer, qu'il s'agisse de la ligne supérieure ou de la ligne inférieure. Je ne peux pas savoir le nombre et l'ordre des tampons, lors de l'installation il n'y a aucun réglage. Sur Internet, j'ai lu que les paramètres pour la couleur vont aussi comme des tampons, comment s'y référer à travers la fonction iCustom () ou peut-être toute autre fonction pour travailler sur ce point ?

Merci d'avance !

P.S. Existe-t-il de la littérature sur le langage MQL4 ? J'ai déjà téléchargé et presque terminé un tutoriel sur MQL4.

Les numéros de tampon sont comptés à partir de "0",

iCustom(NULL, 0, "ind",150, 0,2) ;

où 150 est la période,

0 est un tampon,

2 est une barre.

https://docs.mql4.com/ru/indicators/iCustom

par exemple

#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red

donc très probablement bleu = 0 tampon

et rouge = 1

 
skyjet:
Alexander ! Merci de partager votre expérience ! Mais en cours de route, j'ai une question : comment se fait l'énumération des devises ? Ou est-ce le nom de la devise dans la f-i de OrderSend() à la place de Symbol() ? Et pourriez-vous m'expliquer comment mettre votre exemple dans le code ? Merci encore pour votre aide ! :)

Roman, expliqué en gros.

Partout où Symbol() est spécifié dans Expert Advisor, mettez par exemple : SymbolMax[nnnn]. Dans OrderSend(), cela ressemble à ceci

tick=OrderSend(SymbolMax[nnnn],OP_BUYSTOP,L,ur,0,sl,tp,CMM,MAGIC[I],0,Red) ;

Je l'ai écrit dans mon conseiller expert, et vous y définissez vos propres valeurs. Vous pouvez définir la liste des devises, par exemple :

string SymbolMax[4] = {"EURUSD", "GBPUSD", "USDCHF", "USDJPY"} ;

Peut-être que quelqu'un l'a implémenté d'une autre manière, mais voici ma recherche de devises - voir le code ci-dessous. J'ai mis start au début de la fonction. De plus, j'ai créé un délai de 5 secondes pour éviter que les messages ne sautent partout.

if(nnnn<24) nnnn+=1; else nnnn=0;
 


J'ai un problème avec une modification en boucle,

la modification est représentée comme une fonction définie par l'utilisateur
La chose la plus intéressante est que la fonction de chalutage standard fonctionne avec ces deux fonctions et je peux le faire seul, mais lorsque j'utilise une modification fractale avec breakeven, j'obtiens des modifications sans fin avec fractal et breakeven.

la modification est basée sur https://book.mql4.com/ru/trading/ordermodify

J'ai l'impression que le critère de modification du Breakeven n'est pas défini correctement, comment puis-je le corriger pour éviter les boucles ?




//ф-я модификации ордеров безубыток

int mod_b()
{
//--------------------------------------------------------------- 2 --
for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
int Tip=OrderType(); // Тип ордера
if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер
double SL=OrderStopLoss(); // SL выбранного орд.
double TP =OrderTakeProfit(); // TP выбранного орд.
double Price =OrderOpenPrice(); // Цена выбранн. орд.
int Ticket=OrderTicket(); // Номер выбранн. орд.
//------------------------------------------------------ 3 --
while(true) // Цикл модификации
{
double TS=Tral_Stop; // Исходное значение
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);//Миним. дист&&((SL<TS && Tip==0)||(SL>TS && Tip==1))
if (TS < Min_Dist) // Если меньше допуст.
TS=Min_Dist; // Новое значение TS
//--------------------------------------------------- 4 --
bool Modify=false; // Не назначен к модифи
switch(Tip) // По типу ордера
{
case 0 : // Ордер Buy
if (NormalizeDouble(SL,Digits)< // Если ниже желаем.
NormalizeDouble(Bid-TS*Point,Digits))
{
SL=Price+18*Point; // то модифицируем его
string Text="Buy "; // Текст для Buy
Modify=true; // Назначен к модифи.
}
break; // Выход из switch
case 1 : // Ордер Sell
if (NormalizeDouble(SL,Digits)> // Если выше желаем.
NormalizeDouble(Ask+TS*Point,Digits)
|| NormalizeDouble(SL,Digits)==0)//или равно нулю
{
SL=Price-18*Point; // то модифицируем его
Text="Sell "; // Текст для Sell
Modify=true; // Назначен к модифи.
}
} // Конец switch
if (Modify==false) // Если его не модифи
break; // Выход из while
//--------------------------------------------------- 5 --

Alert ("Модификация ",Text,Ticket,". Ждём ответ..");
bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его!
//--------------------------------------------------- 6 --
if (Ans==true) // Получилось :)
{
Alert ("Ордер ",Text,Ticket," модифицирован:)");
break; // Из цикла модифи.
}

int mod_f()
{
//--------------------------------------------------------------- 2 --
for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
int Tip=OrderType(); // Тип ордера
if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер
double SL=OrderStopLoss(); // SL выбранного орд.

//------------------------------------------------------обсчет фрактала

int f = 3; //номер бара с которого идет проверка наличия фрагтала
int DnN = 0, UpN = 0; //порядковый номер присвоен к направлению(upper, lower)
double UpFr = 0, DnFr = 0; //числовое значение фрагтала выраженное в еденице валюты присвоен к направлению(upper, lower)
while (f < Bars && (UpFr == 0 || DnFr == 0))
{
if (iFractals(Symbol(), 0, MODE_UPPER, f) != 0)
if (UpFr == 0)
{
UpFr = iFractals(Symbol(), 0, MODE_UPPER, f);//фрактальная отложка вверх(buy)
UpN = f;
}
if (iFractals(Symbol(), 0, MODE_LOWER, f) != 0)
if (DnFr == 0)
{
DnFr = iFractals(Symbol(), 0, MODE_LOWER, f);//фрактальная отложка вниз(sell)
DnN = f;
}
f++;
}
//------------------------------------------------------ 3 --
while(true) // Цикл модификации
{
double UD;
double TS=UD; // Исходное значение
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);//Миним. дист
if(Tip==0)
UD=DnFr;
if(Tip==1)
UD=UpFr;
if (TS < Min_Dist) // Если меньше допуст.
TS=Min_Dist; // Новое значение TS
//--------------------------------------------------- 4 --
bool Modify=false; // Не назначен к модифи
switch(Tip) // По типу ордера
{
case 0 : // Ордер Buy
if (NormalizeDouble(SL,Digits)< // Если ниже желаем.
NormalizeDouble(UD,Digits))
{
SL=UD; // то модифицируем его
string Text="Buy "; // Текст для Buy
Modify=true; // Назначен к модифи.
}
break; // Выход из switch
case 1 : // Ордер Sell
if (NormalizeDouble(SL,Digits)> // Если выше желаем.
NormalizeDouble(UD,Digits)
|| NormalizeDouble(SL,Digits)==0)//или равно нулю
{
SL=UD; // то модифицируем его
Text="Sell "; // Текст для Sell
Modify=true; // Назначен к модифи.
}
} // Конец switch
if (Modify==false) // Если его не модифи
break; // Выход из while
//--------------------------------------------------- 5 --
double TP =OrderTakeProfit(); // TP выбранного орд.
double Price =OrderOpenPrice(); // Цена выбранн. орд.
int Ticket=OrderTicket(); // Номер выбранн. орд.

Alert ("Модификация ",Text,Ticket,". Ждём ответ..");
bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его!
//--------------------------------------------------- 6 --
if (Ans==true) // Получилось :)
{
Alert ("Ордер ",Text,Ticket," модифицирован:)");
break; // Из цикла модифи.
}
 

Bonjour chers utilisateurs du forum.

Comment puis-je demander des devis pour d'autres périodes ? J'ai un modèle sur D et mon indicateur a besoin des cotations LOW, HIGH, OPEN, CLOSE de plus petits délais (M30, H1, H4 par exemple).

 
Slava2007:

Bonjour chers utilisateurs du forum.

Comment puis-je demander des devis pour d'autres périodes ? J'ai un modèle sur D et mon indicateur a besoin des cotations LOW, HIGH, OPEN, CLOSE de plus petits délais (M30, H1, H4 par exemple).

https://docs.mql4.com/ru/series
 

Bonsoir à tous. Dites-moi quelle est l'erreur ici. Voici un morceau de code.

//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
if(Bars<100 || IsTradeAllowed()==false) return ;
//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen() ;
else CheckForClose() ;

if ( !IfTrueThenCountBarWork) return (0) ;
for (int i = OrdersTotal() - 1 ; i >= 0 ; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
if (OrderMagicNumber() == 700000) <---- DANS CETTE LIGNE EST L'ERREUR !!!
CloseAfterSomeBar (CountBar, OrderTicket()) ;
}

}

 
isaev-av:

Bonsoir à tous. veuillez me dire quelle est l'erreur ici. voici un morceau de code.

//+------------------------------------------------------------------+
//| Démarrer la fonction |
//+------------------------------------------------------------------+
void start()
{
//---- vérifier l'historique et le commerce
si(Bars<100 || IsTradeAllowed()==false) return ;
//---- calculer les ordres ouverts par le symbole actuel
si(CalculateCurrentOrders(Symbol())==0) CheckForOpen() ;
sinon CheckForClose() ;

if (!IfTrueThenCountBarWork) return (0) ;
for (int i = OrdersTotal() - 1 ; i >= 0 ; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
if (OrderMagicNumber() == 700000) <---- IN THIS STROKE SPEAKS ERROR !!!
CloseAfterSomeBar (CountBar, OrderTicket())
}

}

Caractère manquant " ;"
 

PapaYozh:
Пропущен символ ";"

Merci ! !! Je n'ai pas remarqué au début.))))


 

Une autre question aux experts. comment entrer correctement la condition d'ouverture : Close[2]<Close[3] par n pour cent pour la vente. pour l'achat le contraire bien sûr. et n peut être optimisé ? merci d'avance !

void CheckForOpen()
{
double ma ;
int res ;
//---- trading uniquement pour les premiers tiks de la nouvelle barre
if(Volume[0]>1) return ;
//---- obtenir la moyenne mobile
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0)
//---- conditions de vente
if(Open[1]>ma && Close[1]<ma)
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,",MAGICMA,0,Red) ;
return ;
}
//---- conditions d'achat
if(Open[1]<ma && Close[1]>ma)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,",MAGICMA,0,Blue) ;
return ;
}

 

Dites-moi où je me suis trompé, s'il vous plaît... ou si c'est MT4 lui-même, mais mes ordres d'achat ne s'ouvrent que sur la barre haute, et mes ordres de vente que sur la barre basse =) Bien que je n'aie même pas stipulé ces conditions dans le code de l'Expert Advisor =)

 extern int TP = 200; 
     extern int TS = 50; 
     extern int TF = 1; 
     extern double lots = 0.1; 
     extern int Pips = 15; 
     extern int MaxPips = 100; 


     int slip = 3; 
     int Magic = 2; 
     int cnt,ticket,total; 

 //+------------------------------------------------------------------+ 
  //| expert initialization function | 
  //+------------------------------------------------------------------+ 
  int init() 
    { 
  //---- 

 //---- 
     return(0); 
    } 
  //+------------------------------------------------------------------+ 
  //| expert deinitialization function | 
  //+------------------------------------------------------------------+ 
  int deinit() 
    { 
  //---- 

 //---- 
     return(0); 
    } 
  //+------------------------------------------------------------------+ 
  //| expert start function | 
  //+------------------------------------------------------------------+ 

 int start() 
    { 
  //---- 

 static double PriceOld = 0.0; 
 double PriceNow; 
 PriceNow = NormalizeDouble(Bid,6); 

 total = OrdersTotal(); 
 if(total < 1) 
 { 
    if((PriceNow-PriceOld)>=Pips*Point && (PriceNow-PriceOld)<MaxPips*Point) 
    { 
           ticket = OrderSend(Symbol(),OP_BUY,lots,Ask,slip,Bid-TS*Point,0,0,Magic,0,Green); 
           if(ticket>0) 
               { 
                  OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES); 
                  Print("Ордер на покупку успешно открыт по цене:" ,OrderOpenPrice()); 
               } 
               else 
               { 
                  Print("Ордер не открыт по причине:" ,GetLastError()); 
                  return(0); 
               } 
     } 

 if((PriceNow-PriceOld)<=(-Pips)*Point && (PriceNow-PriceOld)>(-MaxPips)*Point) 
     { 
           ticket = OrderSend(Symbol(),OP_SELL,lots,Bid,slip,Ask+TS*Point,0,0,Magic,0,Red); 
           if(ticket>0) 
               { 
                  OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES); 
                  Print("Ордер на покупку успешно открыт по цене:" ,OrderOpenPrice()); 
               } 
               else 
               { 
                  Print("Ордер не открыт по причине:" ,GetLastError()); 
                  return(0); 
               } 
     } 
 } 
return(0);
}
Raison: