Et faisons-en un "dessin animé" (multidevises)

 

J'aimerais vraiment tester plusieurs paires en même temps...

Je ne peux pas le faire moi-même... Si vous pouvez m'aider à faire un EA multi-devises), je comprendrai l'essence du travail avec plusieurs paires...

Je l'ai écrit moi-même, pour cinq chiffres... ...et pris quelque chose sur le forum...)

description ici)

//+------------------------------------------------------------------+
//|                                            20090717_H4_Candy.mq4 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "LITE"
#property link      "http://www.metaquotes.net"

#include <stdlib.mqh>

extern double Profit = 2000;

double Price[2];
int    giSlippage;

int iOrders, i;
double b0, b1, s0, s1, StopLoss, Enter;
bool dwn, up, mod;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   Profit*=Point; 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   iOrders=OrdersTotal()-1;//количество отложенных ордеров
   
   if(OrdersTotal()==0){
      mod=false;
      SetOrders();}
   
   if((OrdersTotal()>0) && (AccountProfit())&& (! mod)) SetStop();
   
   if(OrdersTotal()>0){
      if( up) UpTrend();
      if( dwn) DownTrend();}

//----
   return(0);
  }
//+------------------------------------------------------------------+

//-------Удаление всех ордеров
void CloseOpenOrdersAndCancelPending()
   {
    for( i= iOrders; i>=0; i--) {
      if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
        if((OrderType()<=OP_SELL) && GetMarketInfo()) {
          if(!OrderClose(OrderTicket(),OrderLots(), Price[1-OrderType()], giSlippage)) Print( OrderError());
        }
        else if(OrderType()>OP_SELL) {
          if(!OrderDelete(OrderTicket())) Print( OrderError());
        }
      }
    }
  }

//-------Поиск входа для установки ордеров и удаление всех ордеров
bool UpTrend()
  {
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) <= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) > 0)){
         up=false;
         dwn=true;
         //DeleteAllPendingOrders();
         CloseOpenOrdersAndCancelPending();
         return(true);}
     else 
        return(false);
  }
bool DownTrend()
  {
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) >= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) < 0)){
         up=true;
         dwn=false;
         //DeleteAllPendingOrders();
         CloseOpenOrdersAndCancelPending();
         return(true);}
     else 
         return(false);
  }

//-------Установка ордеров  
 void SetOrders()
   {
      if(UpTrend()){
         Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
         RefreshRates();
         OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Ask+Profit, 0, 0,0, Green);}
      
      if(DownTrend()){
         Enter=iLow(NULL,PERIOD_H4,1)-10*Point;
         RefreshRates();
         OrderSend(Symbol(), OP_SELLSTOP, 0.1, Enter, 0, 0, Bid-Profit, 0, 0,0, Green);}
   }
   
//-------Вычисление и утановка стопа
void SetStop()
   {
      RefreshRates();
      b0=iLow(NULL,PERIOD_H4,0)-10*Point;
      b1=iLow(NULL,PERIOD_H4,1)-10*Point;
      s0=iHigh(NULL,PERIOD_H4,0)+(Ask-Bid)+10*Point;
      s1=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;

      
      if(OrderSelect(0, SELECT_BY_POS)){       
         if(OrderType()==OP_BUY){
            if( b0< b1) StopLoss= b1;
            else StopLoss= b0;
            RefreshRates();
            mod=OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
            if( mod) return(true);}
         else{
            if( s0< s1) StopLoss= s0;
            else StopLoss= s1;
            RefreshRates();
            mod=OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
            if( mod) return(true);
         }
      } 
   }
 
//+------------------------------------------------------------------+
//| Function..: OrderError                                           |
//+------------------------------------------------------------------+
string OrderError() {
  int iError=GetLastError();
  return(StringConcatenate("Order:",OrderTicket()," GetLastError()=", iError));
}

//+------------------------------------------------------------------+
//| Function..: GetMarketInfo                                        |
//| Returns...: bool Success.                                        |
//+------------------------------------------------------------------+
bool GetMarketInfo() {
  RefreshRates();
  Price[0]=MarketInfo(OrderSymbol(),MODE_ASK);
  Price[1]=MarketInfo(OrderSymbol(),MODE_BID);
  double dPoint=MarketInfo(OrderSymbol(),MODE_POINT);
  if( dPoint==0) return(false);
  giSlippage=( Price[0]- Price[1])/ dPoint;
  return( Price[0]>0.0 && Price[1]>0.0);
}



 
ALex2008 писал(а) >>

J'aimerais vraiment tester plusieurs paires en même temps...

Je ne peux pas le faire moi-même... Mais je vous serais reconnaissant si vous pouviez m'aider à réaliser un EA multi-devises).

Je l'ai écrit moi-même... Je l'ai écrit moi-même ... et j'ai pris ce dont j'avais besoin sur le forum ...)

Alors peut-être qu'il suffit de le mettre sur quelques paires.

 
Vinin >> :

Alors peut-être qu'il suffit de le mettre sur plusieurs paires.

Cela ne fonctionnera pas, car j'ai écrit pour une paire... les signaux sont pris sur la paire actuelle, et le travail avec les ordres est organisé pour une seule paire(

if(OrdersTotal()==0)...
if(OrdersTotal()>0)...

Bien sûr, je peux connecter les signaux avec d'autres paires... ...mais je ne peux pas gérer les commandes avec eux... du moins pas encore)

 
ALex2008 писал(а) >>

Cela ne fonctionnera pas ainsi, car j'ai écrit pour une paire... les signaux sont pris à partir de la paire actuelle, et le travail avec les ordres est organisé pour une seule paire(

Peut-être que quelqu'un voudrait le refaire. Je suis paresseux.

 
Vinin >> :

Peut-être que quelqu'un voudrait le refaire. Je suis trop paresseux.

Nous allons attendre, alors. >> peut-être que quelqu'un peut aider.)

 
ALex2008 >> :

J'aimerais vraiment tester plusieurs paires en même temps...

Je ne peux pas le faire moi-même... mais j'apprécierais que vous m'aidiez à réaliser un EA multi-devises)

Si vous voulez faire un EA multi-devises dans un testeur, vous ne pouvez pas le tester en principe (il ne génère des ticks que pour une paire testée). A cette fin, un même EA devrait distinguer ses propres ordres et les ordres d'autres EA en utilisant le même numéro magique défini par exemple dans ses paramètres ;)

 
ForexTools >> :

...Pour ce faire, le même conseiller doit être capable de distinguer ses propres ordres de ceux des autres par la même magie définie par exemple dans ses paramètres ;)

En principe, il m'importe peu de savoir s'il s'agira d'un véritable multi ou s'il s'agit simplement de distinguer les commandes des autres. Je veux trader sur plusieurs paires, pas sur une seule... Je veux l'essayer sur une démo pendant un mois ou deux... Je suis juste intéressé par le résultat...).

 
ForexTools >> :

À cette fin, le même conseiller expert devrait distinguer ses propres ordres de ceux des autres par la même magie, par exemple dans ses paramètres ;).

..ou généré automatiquement;))

 
granit77 >> :

...ou généré automatiquement;))

Je vais mettre le code avec le générateur de magik... mais ce que j'y gagne... J'ai besoin de comprendre l'algorithme).

 

Ça pourrait aider.

int Order_Count[6];
//===============================================================================
// Функция возвращаюшая количество ордеров определенного типа исхода из заданных ограничений
//===============================================================================
void Order_Count_Calculate(string _Symbol, int Magic){
   ArrayInitialize( Order_Count,0);
   for (int i = OrdersTotal() - 1;  i >= 0;  i--) {
      if (!OrderSelect( i, SELECT_BY_POS, MODE_TRADES))   continue;
      if (OrderSymbol() != _Symbol)                      continue;
      if (OrderMagicNumber() != Magic)                   continue;
      Order_Count[OrderType()]++;
   }
}
 

Et d'ailleurs, vous avez beaucoup d'erreurs dans votre code !

iLow(PERIOD_H4,0,0) - qu'est-ce que c'est ?

Raison: