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

 

Можно малость переделать мою функцию, что бы возвращала общее количество ордеров по данному инструменту и магику.

 
ALex2008 писал(а) >>

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

Сформулируйте логику работы мультивальтного эксперта, чем подробней тем лучше и возможно вам помощь уже и не понадобится.

Как правило четкое осознание задачи 90% успеха её реализации.

 
sergeev >>:

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

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

Лоу текущей свечи))

И правда...! Как же оно вообще тогда работает на тесте?

Не пойму как так у меня получилось.. Должно быть так - iLow(NULL,PERIOD_H4,0)

 
xeon >>:

Сформулируйте логику работы мультивальтного эксперта, чем подробней тем лучше и возможно вам помощь уже и не понадобится.

Как правило четкое осознание задачи 90% успеха её реализации.

Да с логикой всё впорядке) Опыта просто нет.. Я понимаю, что нужно отслеживать ордера по какому-либо признаку, но так как ниразу не писал ничего подобного боюсь что просто будут одни вопросы... про функции и их реализации)

 
ALex2008 писал(а) >>

Да с логикой всё впорядке) Опыта просто нет.. Я понимаю, что нужно отслеживать ордера по какому-либо признаку, но так как ниразу не писал ничего подобного боюсь что просто будут одни вопросы... про функции и их реализации)

Функцию на рпедыдущей странице посмотри

 
Vinin >>:

Функцию на рпедыдущей странице посмотри

Спасибо) попробую в код воткнуть)

Начал писать..

#define MAGIC 7779

вместо этого -

   if(OrdersTotal()==0){
      mod=false;
      SetOrders();}

пишу это -

   if(Order_Count_Calculate(Symbol(),MAGIC)==0){
      mod=false;
      SetOrders();}

.. ругается - 'Order_Count_Calculate' - function returns no result

Если правильно понимаю функция должна найти все ордера текущего символа Symbol() с магиком MAGIC
 
ALex2008 писал(а) >>

Спасибо) попробую в код воткнуть)

Начал писать..

Вот этого точно не надо extern string _Symbol = Symbol();

Хотя переменную можно и определить, а значение присвоить лучше в инит() или старт()

 
Вот и запнулся на первой же функции..( Смысл понял, но как правильно её использовать видимо не дойду...
 
ALex2008 писал(а) >>

Да с логикой всё впорядке) Опыта просто нет.. Я понимаю, что нужно отслеживать ордера по какому-либо признаку, но так как ниразу не писал ничего подобного боюсь что просто будут одни вопросы... про функции и их реализации)

Ээх.... боюсь вы не поняли..............

Задача - "хочу чтоб оно летало", эт не логига, - что летало куда летало и т.д и т.п.

--------------------------------------------

Краткий пример задачи:

Одновременная работа с валютными парами EURUSD, GBPUSD, USDCHF, USDJPY.

Период H1.

......................

условие выбора валютной пары

условие установки BUY

условие установки SELL

.......................

Краткий пример реализации:

int MAGIC = 322223;
string Sym[]={"EURUSD", "GBPUSD", "USDCHF", "USDJPY"};    //Внесем в массив валютные пары с которыми будем работать
int start(){
   
   int s = SymbolSelect();                   //Функция выбора валютной пары
   if(SelectOrder(Sym[s],OP_BUY,MAGIC)<0){   //Если нет установленного ордера по выбранному символу
      UpTrend(Sym[s]);                       //Проверим условие установки ордера 
   }
   if(SelectOrder(Sym[s],OP_SELL,MAGIC)<0){  //Если нет установленного ордера по выбранному символу
      DownTrend(Sym[s]);                     //Проверим условие установки ордера 
   }

}


int SymbolSelect(){
  int s=-1;
  //Условие выбора валютной пары для работы  
   
  return(s)
}
    //+-------------------Выбор ордера---------------------------+
int SelectOrder(string Sym,int Tip,int MAGIC){
    int TotOrd=OrdersTotal();
    int OrdTick=-1;
    for(int OrdPos=TotOrd-1;OrdPos>=0;OrdPos--){
        if(OrderSelect(OrdPos, SELECT_BY_POS, MODE_TRADES)==true){
           if(OrderSymbol()==Sym){                                           //Есть ли ордера с нужным символом
              if(OrderType()==Tip){                                          //Если нужный тип ордера  
                 if(MAGIC==0){MAGIC=OrderMagicNumber();}                     //Если магик = 0,неучитывать
                 if(OrderMagicNumber() == MAGIC){                            //Есть ли ордера с нужным Магик номером
                    OrdTick = OrderTicket(); break;                          //Запишем в переменную его тикет и прервем цикл 
    }}}}}
    return(OrdTick);                                                         //Возвращает тикет найденного ордера или -1
}
bool UpTrend(string Sym){
     //Условие установки BUY ордера
}
bool DownTrend(string Sym){
    //Условие установки SELL ордера
}

ну и т.д.

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

 
xeon >>:

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

Буду сегодня обдумывать... Чувствую нашел я себе головную боль)) Спасибо.

Вобщем вот черновик с ошибками... поправьте плиз!)

extern double Profit = 3000;

int MAGIC = 322223;

string Sym[]={"EURUSD", "GBPUSD", "USDCHF", "USDJPY"};    //Внесем в массив валютные пары с которыми будем работать

double b0,b1,s0,s1,StopLoss,Enter;
bool dwnSym,upSym,mod;

int init(){Profit*=Point;
}

int start()
{
   
      int s = SymbolSelect();                      //Функция выбора валютной пары
      if(SelectOrder(Sym[s],OP_BUYSTOP,MAGIC)<0){  //Если нет установленного ордера по выбранному символу
         UpTrend(Sym[s]);                          //Проверим условие установки ордера 
         }
      if(SelectOrder(Sym[s],OP_SELLSTOP,MAGIC)<0){ //Если нет установленного ордера по выбранному символу
         DownTrend(Sym[s]);                        //Проверим условие установки ордера 
         }
      
      
      if(SelectOrder(Sym[s],OP_BUYSTOP,MAGIC)>0 && AccountProfit()&& (!mod)){  //Если установлен ордер по выбранному символу
         SetStopBuy(Sym[s]);                                                  //и он открылся, ставим стоп
         }
      if(SelectOrder(Sym[s],OP_SELLSTOP,MAGIC)>0 && AccountProfit()&& (!mod)){ //Если установлен ордер по выбранному символу
         SetStopSell(Sym[s]);                                                 //и он открылся, ставим стоп
         }
}

   int SymbolSelect(){
   int s=-1;
   return(s);}
   
//+-------------------Выбор ордера---------------------------+
   int SelectOrder(string Sym,int Tip,int MAGIC){
      int TotOrd=OrdersTotal();
      int OrdTick=-1;
      for(int OrdPos=TotOrd-1;OrdPos>=0;OrdPos--){
         if(OrderSelect(OrdPos, SELECT_BY_POS, MODE_TRADES)==true){
            if(OrderSymbol()==Sym){                                           //Есть ли ордера с нужным символом
               if(OrderType()==Tip){                                          //Если нужный тип ордера  
                  if(MAGIC==0){MAGIC=OrderMagicNumber();}                     //Если магик = 0,неучитывать
                  if(OrderMagicNumber() == MAGIC){                            //Есть ли ордера с нужным Магик номером
                     OrdTick = OrderTicket(); break;                          //Запишем в переменную его тикет и прервем цикл 
      }}}}}
    return(OrdTick);}                                                         //Возвращает тикет найденного ордера или -1


//Условие и установка BUY ордера
   bool UpTrend(string Sym){
       
       if((iOpen(Sym,PERIOD_H4,1) - iClose(Sym,PERIOD_H4,1) <= 0) &&
         (iOpen(Sym,PERIOD_H4,2) - iClose(Sym,PERIOD_H4,2) > 0)){
          upSym=false;
          dwnSym=true;
          CloseOpenOrdersAndCancelPending();
          double Enter=iHigh(Sym,PERIOD_H4,1)+(Ask-Bid)+10*Point;
          OrderSend(Sym, OP_BUYSTOP, 0.1, Enter, 0, 0, Ask+Profit, 0, 0,0, Green);}
   }

//Условие и установка SELL ордера
   bool DownTrend(string Sym){
       
       if((iOpen(Sym,PERIOD_H4,1) - iClose(Sym,PERIOD_H4,1) >= 0) &&
         (iOpen(Sym,PERIOD_H4,2) - iClose(Sym,PERIOD_H4,2) < 0)){
          upSym=true;
          dwnSym=false;
          CloseOpenOrdersAndCancelPending();
          double Enter=iLow(Sym,PERIOD_H4,1)-10*Point;
          OrderSend(Sym, OP_SELLSTOP, 0.1, Enter, 0, 0, Bid-Profit, 0, 0,0, Green);}
         
   }
   
//-------Вычисление и утановка стопа для бай
void SetStopBuy(string Sym)
   {
      RefreshRates();
      double b0=iLow(Sym,PERIOD_H4,0)-10*Point;
      double b1=iLow(Sym,PERIOD_H4,1)-10*Point;
      
            if(b0<b1) StopLoss=b1;
            else StopLoss=b0;
            RefreshRates();
            mod=OrderModify(OrdTick,OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);
   } 
   
 //-------Вычисление и утановка стопа для сел
void SetStopSell(string Sym)
   {
      RefreshRates();
      double s0=iHigh(Sym,PERIOD_H4,0)+(Ask-Bid)+10*Point;
      double s1=iHigh(Sym,PERIOD_H4,1)+(Ask-Bid)+10*Point;
      
            if(s0<s1) StopLoss=s0;
            else StopLoss=s1;
            RefreshRates();
            mod=OrderModify(OrdTick,OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);
   }
   
void CloseOpenOrdersAndCancelPending()
   {
      for (int i=OrdersTotal()-1;i>=0;i--){
      if (!OrderSelect(i,SELECT_BY_POS))  continue;
      if (OrderSymbol()!=Sym)        continue;
      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10);}
   }
Причина обращения: