Программисты не проходите мимо помогите с кодом!

 

Здравствуйте! Помогите советом или поделитесь опытом как это сделать. Вот суть проблемы:

Нужно чтобы советник работал по двум разным стратегиям: 

1. Цена поднялась выше +10 пунктов --- > стратегия1. И различное движение цены ниже 10 или выше пунктов никак не могло бы запустить стратегию2 и не включить повторно стратегию1 до тех пор пока количество ордеров не будет равно нулю.

2. Цена опустилась ниже -10 пунктов --->стратегия2. Различное движение Более 10 пунктов вверх или вниз не "включит" стратегию1 или повторно стратегию2  до тех пор пока количество ордеров не будет равно нулю.

Мне представляется это что-то вроде не полного RS-триггера. Но этот вариант не работает!


  if (x1) {   // если цена более +10 п. то..
         if (!x2) {  // если цена менее -10 п. то .. 
         y1=0; y2=1;  // стратегия1 выкл, стратегия2 вкл.
         while (x1);           
     }  
   }  else {  
      if (x2) {  // цена менее -10 п. то..
      y1=1; y2=0; // стратегия1 вкл., стратегия2 выкл.   
      while (x2);           
   }  
}

Заранее Спасибо!


 
Надо ордера как-то помечать. Если в рынке есть ордера стратегии 1 - работаем по ней, если в рынке ордера стратегии 2 - рабтаем по второй. Если в рынке нет ордеров - выбираем стрегию. Помечать ордера можно используя разные магики или комментарий ордера.
 

Что Вы вкладываете в понятие "Цена поднялась выше +10 пунктов" или " Цена опустилась ниже -10 пунктов"?

Integer писал(а) >>
Надо ордера как-то помечать. Если в рынке есть ордера стратегии 1 - работаем по ней, если в рынке ордера стратегии 2 - рабтаем по второй. Если в рынке нет ордеров - выбираем стрегию. Помечать ордера можно используя разные магики или комментарий ордера.

Необязательно, можно ордера передавать между стратегиями, ИМХО так даже перспективнее...

 
Figar0 писал(а) >>

Что Вы вкладываете в понятие "Цена поднялась выше +10 пунктов" или " Цена опустилась ниже -10 пунктов"?

Необязательно, можно ордера передавать между стратегиями, ИМХО так даже перспективнее...

Тогда помечать ордера глобальными переменными с тикетом в имени переменной. Есть другие варианты? (Кроме записи в файл)

 
Integer писал(а) >>

Тогда помечать ордера глобальными переменными с тикетом в имени переменной. Есть другие варианты? (Кроме записи в файл)

Не увидел главного " до тех пор пока количество ордеров не будет равно нулю" ) Пора спать.

 
Figar0 писал(а) >>

Не увидел главного " до тех пор пока количество ордеров не будет равно нулю" ) Пора спать.

Это есть ) - "Если в рынке нет ордеров - выбираем стрегию"

 

через массив...

OrderNomber001[2];

...

OrderNomber00X[2];

где

OrderNomber001[1] - реальный магик (живет до окончательного закрытия ордера)

OrderNomber001[2] - виртуальный магик, присваеваемый при переходе от стратегии к стратегии

имеется ввиду, что в магике закодирована стратегия...

 
DDFedor писал(а) >>

через массив...

OrderNomber001[2];

...

OrderNomber00X[2];

где

OrderNomber001[1] - реальный магик (живет до окончательного закрытия ордера)

OrderNomber001[2] - виртуальный магик, присваеваемый при переходе от стратегии к стратегии

имеется ввиду, что в магике закодирована стратегия...

Как при этом разрулить ордера при перезапуске эксперта?

 

первое, что приходит - писать в файл, но если "процедура экстренного закрытия ордеров" не сработает - выполнение инвентаризации ордеров " при сбое" и попытка подхватить потеряную стратегию ( по текущим расчетам). "сбой" я имею ввиду вообще отключение терминала.

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

 
shamilzzz >>:

Здравствуйте! Помогите советом или поделитесь опытом как это сделать. Вот суть проблемы:

Нужно чтобы советник работал по двум разным стратегиям: 

1. Цена поднялась выше +10 пунктов --- > стратегия1. И различное движение цены ниже 10 или выше пунктов никак не могло бы запустить стратегию2 и не включить повторно стратегию1 до тех пор пока количество ордеров не будет равно нулю.

2. Цена опустилась ниже -10 пунктов --->стратегия2. Различное движение Более 10 пунктов вверх или вниз не "включит" стратегию1 или повторно стратегию2  до тех пор пока количество ордеров не будет равно нулю.

Мне представляется это что-то вроде не полного RS-триггера. Но этот вариант не работает!


  if (x1) {   // если цена более +10 п. то..
         if (!x2) {  // если цена менее -10 п. то .. 
         y1=0; y2=1;  // стратегия1 выкл, стратегия2 вкл.
         while (x1);           
     }  
   }  else {  
      if (x2) {  // цена менее -10 п. то..
      y1=1; y2=0; // стратегия1 вкл., стратегия2 выкл.   
      while (x2);           
   }  
}

Заранее Спасибо!







Привет всем!

Вроде так понял по условию :


int strategy_flag;

int start()
{


if(OrdersTotal()==0){strategy_flag=0;}// обнулить флаг используемой стратегии т.к. нет открытых ордеров


 if(strategy_flag==0)    //если стратегия не используется проверим уссловие на выбор одной из предложенных
                                 //непонятно в вопросе о какой цене идёт речь,т.е. относительно чего её выбирать ???
   {                              //допустим это цена закрытия последнего ордера тогда можем написать так
                                // double cena;
                                // if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY)==true)
                                // {cena = OrderClosePrice();}
                                // вместо "цена" в условии пишем cena и с трёх строк выше снимаем комент

        if( цена+10 <= Bid){strategy_flag=1;} // условие выполнено активируем стратегию №1
        if( цена-10 >= Ask){strategy_flag=2;} // условие выполнено активируем стратегию №2
 
   }


   if(strategy_flag==1)
     {


          код стратегии №1

     }

    if(strategy_flag==2)
       {

          код стратегии №2

      }

}

 

Привет Всем! Вчера не мог нормально объяснить не у своего ПК был.

Вот Код

extern string Comment_MaxCountOrders = "Максимальное количество ордеров:";
extern int MaxCountOrders = 10;
extern int MagicNumber = 12345;
//---------------------------------------------------------------------------------------------------
double gd_240 = 0.0;
double g_price_260;
double g_price_261;

double g_price_292;
double g_price_293;
double g_price_295;

double gd_316;

double gd_300;

double gd_324;
int gi_360 = 0;
int gi_368 = 0;
double gd_372;
int g_pos_380 = 0;
int gi_384;
bool gi_396 = FALSE;
bool gi_400 = FALSE;
bool gi_404 = FALSE;

bool gi_405 = FALSE; // 
bool gi_406 = FALSE; // 
int gi_408;

bool gi_412 = FALSE;
int g_datetime_416 = 0;
int g_datetime_420 = 0;
double gd_424;
double gd_432;
double MyPoint; // пункты для 3х и 5значных дилинговых центров
//---------------------------------------------------------------------------------
int init() {
   if(Point==0.001 || Point==0.00001) MyPoint=Point*10; else MyPoint=Point; 
  
   switch (MarketInfo(Symbol(), MODE_MINLOT)) {
   case 0.001:
      gd_240 = 3;
      break;
   case 0.01:
      gd_240 = 2;
      break;
   case 0.1:
      gd_240 = 1;
      break;
   case 1.0:
      gd_240 = 0;
   }
   return (0);
}
//--------------------------------------------------------------------------------
int deinit() {
   return (0);
}
//--------------------------------------------------------------------------------
int start() {
// Ждем, когда сформируется новый бар
   if (gi_360 == Time[0]) return (0);
   gi_360 = Time[0];
   //////
   gi_384 = CountTrades();  // функция подсчёта ордеров
   if (gi_384 > 0 && gi_384 <= MaxCountOrders) {
   // условие Если (количество открытых ордеров > 0 И количество открытых ордеров <= Маx (число))
   for (g_pos_380 = OrdersTotal() - 1; g_pos_380 >= 0; g_pos_380--) {
   // цикл определения ордеров Свой/чужой
      OrderSelect(g_pos_380, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_BUY) {
            gi_400 = TRUE;  // Ордер BUY
            gi_404 = FALSE; //
            break;
            }
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_SELL) {
            gi_400 = FALSE;
            gi_404 = TRUE; // Ордер SELL
            break;
            }
        }
    }
      
//////////////////////////////////////////////////////////////////////////////////////////////////////////      
      if (gi_384 > 0 && gi_384 <= MaxCountOrders) { 
      // условие Если (количество открытых ордеров > 0 И количество открытых ордеров <= Маx (число))
      RefreshRates();
      gd_316 = FindLastBuyPrice(); // Функция определяет последнюю известную цену на Покупку
      gd_324 = FindLastSellPrice(); // Функция определяет последнюю известную цену на Продажу
      // так раньше было не полный RS -триггер
      if ((gi_400 && gd_316 - Ask >= StepLots1 * MyPoint)||(gi_404 && Bid - gd_324 >= StepLots1 * MyPoint)) {
         if (!((gi_400 && Bid - gd_316 >= StepLots2 * MyPoint)||(gi_404 && gd_324 - Ask >= StepLots2 * MyPoint))) {            
            gi_405 = FALSE; // выключена стратегия1
            gi_406 = TRUE;  // включена стратегия2
            }
     } else {
         if ((gi_400 && Bid - gd_316 >= StepLots2 * MyPoint)||(gi_404 && gd_324 - Ask >= StepLots2 * MyPoint)) {
            gi_405 = TRUE; // включена стратегия1
            gi_406 = FALSE; // выключена стратегия2
            } 
         } 
     }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ///
     ///
     //--------------------------------------------------------------------------------
double FindLastBuyPrice() { //Функция определяет последнюю известную цену на Покупку
   double l_ord_open_price_8;
   int l_ticket_24;
   int l_ticket_20 = 0;
   for (int l_pos_16 = OrdersTotal() - 1; l_pos_16 >= 0; l_pos_16--) {
      OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_BUY) {
         l_ticket_24 = OrderTicket();
         if (l_ticket_24 > l_ticket_20) {
            l_ord_open_price_8 = NormalizeDouble(OrderOpenPrice(),Digits);
            l_ticket_20 = l_ticket_24;
         }
      }
   }
   return (l_ord_open_price_8);
}
//--------------------------------------------------------------------------------
double FindLastSellPrice() { // Функция определяет последнюю известную цену на Продажу
   double l_ord_open_price_8;
   int l_ticket_24;
   int l_ticket_20 = 0;
   for (int l_pos_16 = OrdersTotal() - 1; l_pos_16 >= 0; l_pos_16--) {
      OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_SELL) {
         l_ticket_24 = OrderTicket();
         if (l_ticket_24 > l_ticket_20) {
            l_ord_open_price_8 = NormalizeDouble(OrderOpenPrice(),Digits);
            l_ticket_20 = l_ticket_24;
         }
      }
   }
   return (l_ord_open_price_8);
}
Причина обращения: