E facciamone un "cartone animato" (multicurrency)

 

Mi piacerebbe davvero testare alcune coppie allo stesso tempo...

Non posso farlo da solo... Se potete aiutarmi a fare un EA multicurrency) capirò l'essenza del lavoro con diverse coppie...

L'ho scritto io stesso, per cinque cifre... ...e ha preso qualcosa dal forum...)

descrizione qui)

//+------------------------------------------------------------------+
//|                                            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 писал(а) >>

Mi piacerebbe davvero testare su alcune coppie allo stesso tempo...

Non posso farlo da solo... Ma vi sarei grato se poteste aiutarmi a fare un EA multicurrency)

L'ho scritto io stesso... L'ho scritto io stesso ... e ho preso quello che mi serviva dal forum ...)

Quindi, magari, mettetelo solo su alcune coppie.

 
Vinin >> :

Quindi forse basta metterlo su diverse coppie.

Questo non funzionerà, perché ho scritto per una coppia... i segnali sono presi dalla coppia corrente, e il lavoro con gli ordini è organizzato per una sola coppia (

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

Naturalmente, posso collegare i segnali con altre coppie... ...ma non posso gestire gli ordini con loro... almeno non ancora)

 
ALex2008 писал(а) >>

Non funzionerà così, perché ho scritto per una coppia... i segnali sono presi dalla coppia corrente, e il lavoro con gli ordini è organizzato per una sola coppia(

Forse qualcuno vorrebbe rifarlo. Sono pigro.

 
Vinin >> :

Forse qualcuno vorrebbe rifarlo. Sono troppo pigro.

Aspetteremo, allora. >> forse qualcuno può aiutare).

 
ALex2008 >> :

Mi piacerebbe davvero testare alcune coppie allo stesso tempo...

Non posso farlo da solo... ma vi sarei grato se poteste aiutarmi a fare un EA multicurrency)

Se vuoi fare un EA multivaluta in un tester, non puoi testarlo in linea di principio ( genera tick solo per una coppia sotto test). A questo scopo uno stesso EA dovrebbe distinguere i propri ordini e gli ordini di altri EA usando lo stesso numero magico impostato per esempio nei suoi parametri ;)

 
ForexTools >> :

...Per fare questo, lo stesso consigliere deve essere in grado di distinguere tra i suoi ordini e quelli degli altri con la stessa magia impostata per esempio nei suoi parametri ;)

In linea di principio, non importa per me se sarà un vero multi o solo distinguere gli ordini degli altri. Voglio fare trading su diverse coppie, non su una... Voglio provare su una demo per un mese o due... Sono solo interessato al risultato...)

 
ForexTools >> :

...Per fare questo, lo stesso EA deve distinguere tra i suoi ordini e quelli degli altri con la stessa magia impostata per esempio nei suoi parametri ;)...

..o generato automaticamente;))

 
granit77 >> :

...o generato automaticamente;))

Metterò il codice con il generatore di magia... ma cosa ci guadagno io... Ho bisogno di capire l'algoritmo).

 

Potrebbe aiutare.

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()]++;
   }
}
 

E comunque, hai un sacco di errori nel tuo codice!

iLow(PERIOD_H4,0,0) - cos'è questo?