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

 

Bonsoir. J'ai essayé de le montrer dans l'image pour plus de clarté. Supposons que j'ai un "Dodge", lorsque le prix de la NEXT bar est supérieur au maximum du "Dodge" - j'achète, T/P, disons 15 points, et le prix sur la même barre et monte et l'ordre (Buy_2) avec T/P de 15 points s'ouvre à nouveau, et je n'ai pas besoin decette 2-ème ouverture (Buy_2) sur la 1ère barre après le "Dodge". Comment lever ce malentendu ?

 
iMAG:

Chers professionnels et connaisseurs !

Je suis perdu - l'indicateur BB donne des signaux que je ne comprends pas (pas "rouge-vert-rouge" !). Pour être plus précis, j'ai lancé un tel appel :

bolup = iBands(Symbol(), 0, 24, 0, 2, 0, 1, 1) ;
boln = iBands(Symbol(), 0, 24, 0, 2, 0, 2, 1) ;
bolmd = (bolup + boldn) / 2 ;
Print("Bandes supérieures = ", bolup ;)
Print("Bandes inférieures = ", boldn) ;
Print("Bands media = ", bolmd) ;

Le résultat est que les 3 variables donnent la même valeur. >8-O

Paire EUR, TF - H1. Des idées ?

Merci d'avance...

Voulez-vous également régler l'écart sur négatif ?
 
Fantar:

Pour plus de clarté, j'ai essayé d'en faire un dessin à l'adresse.

Maintenant, essayez de faire la même chose sur mq4. Voici une branche pour les questions, si quelque chose n'est pas clair. Il y a le service Travail pour créer des EA à partir de zéro.
 
iMAG:

Chers professionnels et connaisseurs !

Je suis perdu - l'indicateur BB me donne des signaux incompréhensibles (pas de "rouge-vert-rouge" !). Pour être plus précis, je donne l'appel suivant :

bolup = iBands(Symbol(), 0, 24, 0, 2, 0, 1, 1) ;
boldn = iBands(Symbol(), 0, 24, 0, 2, 0, 2, 1) ;
bolmd = (bolup + boldn) / 2 ;
Print("Bands upper = ", bolup) ;
Print("Bands lower = ", boldn) ;
Print("Bands media = ", bolmd) ;

Par conséquent, les 3 variables donnent la même valeur. >8-O

C'est EUR, H1. Des idées ?

Merci d'avance...

L'écart par rapport à la ligne principale que vous avez définie est de 0 (zéro). Il devrait être supérieur à zéro.
 

L'essence de la stratégie : Entrée par signal stochastique (5,14,3) sortie également par stochastique mais avec une autre période (5,3,3). Je ne comprends pas comment faire une sortie par stochastique et non par signal inverse.
J'ai un problème et je n'ai aucune idée de la façon dont il peut être résolu, je vais essayer de vous expliquer.
Ainsi, dans le code que j'ai posté, il y a 2 fonctions
//+------------------------------------------------------------------+
//| подготовить массив тикетов для закрытия |
//+------------------------------------------------------------------+
void PrepareTicketsToClose(int signal, bool Revers, int & ticketsClose[][2], double & lots[],double arrayTickets[][9])
{
int size=ArrayRange(arrayTickets,0);
//----
if (size==0) return;

int i,type,ticket,closeSize;
for (i=0;i<size;i++)
{
type=arrayTickets[i][1];
// если тип ордера не рыночный, то пропускаем
if (type>OP_SELL) continue;

if (Revers) // перевернем тип рыночного ордера
{
if (type==OP_BUY) type=OP_SELL; else type=OP_BUY;
}

// тут решаем для каждого открытого ордера его судьбу
// оставить в рынке или добавить в массив на закрытие
if (type==OP_BUY)
{
//
// код разрешающий оставить покупку

// как пример
if (signal==OP_BUY) continue;
}

if (type==OP_SELL)
{
//
// код разрешающий оставить продажу

// как пример
if (signal==OP_SELL) continue;
}

closeSize=ArrayRange(ticketsClose,0);
ArrayResize(ticketsClose,closeSize+1);
ArrayResize(lots,closeSize+1);
ticketsClose[closeSize][0] = arrayTickets[i][0]; // # тикета
ticketsClose[closeSize][1] = arrayTickets[i][1]; // тип ордера

// здесь укажем сколько лотов нужно закрыть
lots[closeSize] = arrayTickets[i][2]; // закрываемый объем
// можно закрывать частично, тогда нужно переписать строку сверху
}
//----
return;
}

//+------------------------------------------------------------------+
//| Закрывает ордера с указанными тикетами |
//+------------------------------------------------------------------+
void CloseMarketOrders(int ticketsArray[][2], double lotsArray[])
{
//----
int i,size=ArrayRange(ticketsArray,0);
if (size==0) return;

int ticket,type;
double lots;
bool res;

int total=OrdersTotal();

for (i=0;i<size;i++)
{
ticket = ticketsArray[i][0];
type = ticketsArray[i][1];
lots = lotsArray[i];
RefreshRates(); // на всякий случай обновим сведения о рыночном окружении

// блок закрытия покупок
if (type==OP_BUY)
{
res = OrderClose(ticket,lots,Bid,Slippage,Orange);
if (!res)
{
Print("Не удалось закрыть ордер в покупку #",ticket,"! Ошибка №",GetLastError());
// дальнейшая обработка ошибки, написать самостоятельно
}
}

// блок закрытия продаж
if (type==OP_SELL)
{
res = OrderClose(ticket,lots,Ask,Slippage,Orange);
if (!res)
{
Print("Не удалось закрыть ордер в продажу #",ticket,"! Ошибка №",GetLastError());
// дальнейшая обработка ошибки, написать самостоятельно
}
}

}
//----
return;
}
Dans void PrepareTicketsToClose(int signal, bool Revers, int & ticketsClose[][2], double & lots[],double arrayTickets[][9]) nous devons mettre une condition qui décidera si nous devons laisser ou fermer l'ordre...
J'ai essayé de mettre des conditions mais rien ne fonctionne....
Quelqu'un peut-il regarder et montrer s'il y a une erreur dans ces fonctions ou si je me suis trompé ? ....
Dossiers :
 
Pouvez-vous me dire que si j'ai deux commandes consécutives OrderSend fixant des ordres, dois-je placer la fonction IsTradeAllowed entre elles ?

ou n'est-ce pas nécessaire et l'EA passera du premier appel OrderSend au second seulement après un ordre passé avec succès ?

Si IsTradeAllowed est toujours nécessaire, quel délai doit être fixé dans la boucle while ?
 
Desead:
Pouvez-vous me dire que si j'ai deux commandes consécutives OrderSend fixant des ordres, dois-je placer la fonction IsTradeAllowed entre elles ?

ou n'est-ce pas nécessaire et l'EA passera du premier appel OrderSend au second seulement après un ordre passé avec succès ?

Dans le testeur, ce n'est pas nécessaire, mais sur le compte démo ou réel, vous recevrez un message indiquant que le fil de discussion est occupé.

Desead:


Si IsTradeAllowed est toujours nécessaire, quel délai doit être fixé dans la boucle while ?
Cela dépend de la vitesse d'exécution, qui est différente selon les serveurs. N'oubliez pas d'ajouter également une vérification de boucle sur IsStopped(), sinon vous n'aurez pas de chance.
 
Bonjour, pourriez-vous me dire où je peux télécharger l'archive des cotations détaillées (tick ou minute) ? Les données qui se trouvent dans l'archive des cotations dans MT4 (pas beaucoup) données minute seulement pour 5 jours du test.
 

Bon après-midi. Le système fournit trois points d'entrée pour l'ACHAT et la VENTE. Mais lorsqu'un signal est émis, les positions sont ouvertes sur chaque tick tant que le signal existe. Il y a une erreur quelque part avec les drapeaux. Veuillez m'aider à le comprendre.

   static bool buy_h=true, buy_l=true, buy_50=true,
               sell_h=true, sell_l=true, sell_50=true;

 if(LSMA_Sig==0) // up-trend
    {
      if(Stoch_Sig==4 && buy_l==true)
       { 
         sl=Ask-Stop_Loss*Point;
         Ans=OrderSend(Symb,OP_BUY,Lots,Ask,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
           Alert("Неудачная попытка открыть ордер BUY. Ошибка: ", GetLastError());
         if(Ans==true)
            buy_l=false; // снимем флаг
       }
      //---
      if(Stoch_Sig==0 && buy_50==true)
       {
         sl=Ask-Stop_Loss*Point;
         Ans=OrderSend(Symb,OP_BUY,Lots,Ask,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
           Alert("Неудачная попытка открыть ордер BUY. Ошибка: ", GetLastError());
         if(Ans==true)
            buy_50=false;        
       }
      //---
      if(Stoch_Sig==2 && buy_h==true)
       {
         sl=Ask-Stop_Loss*Point;       
         Ans=OrderSend(Symb,OP_BUY,Lots,Ask,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
           Alert("Неудачная попытка открыть ордер BUY. Ошибка: ", GetLastError());
         if(Ans==true)
            buy_h=false;         
       }   
    }
   if(LSMA_Sig==1) // dn-trend
    {
      if(Stoch_Sig==3 && sell_h==true)
       {
         sl=Bid+Stop_Loss*Point;
         Ans=OrderSend(Symb,OP_SELL,Lots,Bid,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
            Alert("Неудачная попытка открыть ордер SELL. Ошибка: ", GetLastError());
         if(Ans==true)
            sell_h=false;
       }
     //---
     if(Stoch_Sig==1 && sell_50==true)
      {
         sl=Bid+Stop_Loss*Point;      
         Ans=OrderSend(Symb,OP_SELL,Lots,Bid,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
            Alert("Неудачная попытка открыть ордер SELL. Ошибка: ", GetLastError());
         if(Ans==true)
            sell_50=false;         
      }
     //---
     if(Stoch_Sig==5 && sell_l==true)
      {
         sl=Bid+Stop_Loss*Point;      
         Ans=OrderSend(Symb,OP_SELL,Lots,Bid,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
            Alert("Неудачная попытка открыть ордер SELL. Ошибка: ", GetLastError());
         if(Ans==true)
            sell_l=false;        
      }
    }
    
   if(Stoch_Sig!=4 && buy_l==false) // поднимем флаг
       buy_l=true;
   if(Stoch_Sig!=0 && buy_50==false)
       buy_50=true;
   if(Stoch_Sig!=2 && buy_h==false)
       buy_h=true;
   if(Stoch_Sig!=3 && sell_h==false)
       sell_h=true;
   if(Stoch_Sig!=1 && sell_50==false)
       sell_50=true;
   if(Stoch_Sig!=5 && sell_l==false)
       sell_l=true;  
 
silhouette:

Bon après-midi. Le système fournit trois points d'entrée pour l'ACHAT et la VENTE. Mais lorsqu'un signal est émis, les positions sont ouvertes sur chaque tick tant que le signal existe. Il y a une erreur quelque part avec les drapeaux. Veuillez m'aider à le comprendre.

OrdersTotal() donne le nombre de positions déjà ouvertes, c'est-à-dire que nous pouvons l'utiliser pour vérifier s'il y a déjà une position ouverte ou non.