А давайте сделаем из этого "мультик" (мультивалютник)

 

Оч. хочется потестить на нескольких парах одновременно...

Сам не умею... но буду признателен, если вы поможете мне сделать из советника мультивалютник) Заодно и сам пойму суть работы с несколькими парами...

Писал сам, под пятизнак... ну и брал что-то с форума..)

описание тут)

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

Оч. хочется потестить на нескольких парах одновременно...

Сам не умею... но буду признателен, если вы поможете мне сделать из советника мультивалютник)

Писал сам... ну и брал то что нужно с форума..)

Так может просто поставить на несколько пар.

 
Vinin >>:

Так может просто поставить на несколько пар.

Так не будет работать, т.к. писал под одну пару.. сигналы берет с текущей пары, да и работа с ордерами организована только для одной пары(

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

Сигналы конечно я могу связать и с другими парами... но управление ордерами по ним я не смогу... покрайней мере пока)

 
ALex2008 писал(а) >>

Так не будет работать, т.к. писал под одну пару.. сигналы берет с текущей пары, да и работа с ордерами организована только для одной пары(

Может кто захочет переделать. Мне лень.

 
Vinin >>:

Может кто захочет переделать. Мне лень.

Подождем тогда.. Может кто поможет)

 
ALex2008 >>:

Оч. хочется потестить на нескольких парах одновременно...

Сам не умею... но буду признателен, если вы поможете мне сделать из советника мультивалютник)

потестить мультивалютник в тестере нельзя в принципе (он тики генерит только для одной тестируемой пары). поэтому тестить можно только на нескольких графиках на демке. Для этого один и тотже советник должен различать свои и чужие ордера по тому же магику задаваемому например в его параметрах ;)

 
ForexTools >>:

...Для этого один и тотже советник должен различать свои и чужие ордера по тому же магику задаваемому например в его параметрах ;)

Вот именно для этого и прошу помощи) Для меня впринципе не важно, будет-ли он настоящим мульти.. или просто различать чужие ордера.. Суть одна - заставить работать на нескольких парах, а не на одной) Да и потестить на демке не проблема, месяц-пару.. просто интересен результат)

 
ForexTools >>:

..Для этого один и тотже советник должен различать свои и чужие ордера по тому же магику задаваемому например в его параметрах ;)..

..или генерируемому автоматически ;))

 
granit77 >>:

..или генерируемому автоматически ;))

Код я то вставлю с генератором магика... только что мне от него.. Мне алгоритм действий понять бы)

 

Может поможет

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

и кстати, а у вас в коде то ошибочки! куча!

iLow(PERIOD_H4,0,0) - это как понимать?

Причина обращения: