[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 270

 
hoz:


 Ну так я имел ввиду не то, что параметр fi_Ticket не нужен, а почему по дефолту ему значение 0 (нуль) присвоили. Я б сделал просто так:

 Продублирую исходный код ещё раз:

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

P.S. А для начала обратите внимание на наименование переменных, а точнее на их префиксы. Переменные, имеющие начальную b, например, bs_Symbol объявлены на глобальном уровне из библиотеки. Большинство глобальных переменных объявлены в b-PSI@Base.

 

Посмотрите пожалуйста код советника, не могу понять в чем причина.... При первом запуске торгует может сразу открыть сделку, но после закрытия перестает работать, до следующего перезапуска терминала или вкл/выкл разрешить советнику торговлю... Работает по индикатору Gann 2.0

extern string     s0                = "Setup: Main";
extern int        Magic             = 1121;
extern double     lots              = 0.1;
extern int        StopLoss          = 70;
extern int        TakeProfit        = 140;
extern bool       UseTrail          = true;
extern bool       TrailWhileMinus   = false;
extern int        Trail             = 70;

extern string     s1                = "Setup: GANN indicator";
extern bool UseBeginDate = false;
extern string BeginDate = "2010.01.01 00:00";
extern int nBarsBack = 120;//250;
extern string prices = "0=close, 4=median, 5=typical";
extern int Price_Mode = 5;
extern bool Show_GridMatrix = false;
extern bool Show_GannGrid = false;
extern bool Show_HiloArrows = true;
extern bool Show_PriceArrows = true;
extern bool Show_Comments = false;
extern string ____MainGrid____ = "ooo";
extern color MainGrid_Color = Silver;//Green;//Sienna;
extern int MainGrid_Style = STYLE_DOT;
extern int MinMaxGrid_Style = STYLE_SOLID;
extern int MainGrid_Width = 1;
extern int fontSize = 8;
extern bool Draw_AllGrids = false;
extern bool Draw_AdditionalGrids = false;
extern string ____GannGrid____ = "ttt";
extern color GannGrid_Color = Silver;//Gray;
extern int GannGrid_Style = STYLE_DOT;
extern int GannGrid_Width = 177;
extern string ____Default_GridParameters____ = "Recomanded GridInterval 35 or 36";
extern int MainGrid_Intervals = 3677;   //default=35(!)
extern double GannGrid_Interval = 8.0;//with default 8.5 is the time interval not OK; and 9 is too large
extern int Text_Shift = 50;

//s1, UseBeginDate, BeginDate, nBarsBack, prices, Price_Mode, Show_GridMatrix, Show_GannGrid, Show_HiloArrows, Show_PriceArrows, Show_Comments, ____MainGrid____, MainGrid_Style, MinMaxGrid_Style, MainGrid_Width, fontSize, Draw_AllGrids, Draw_AdditionalGrids, ____GannGrid____, GannGrid_Style, GannGrid_Width, ____Default_GridParameters____, MainGrid_Intervals, GannGrid_Interval, Text_Shift

int               slip              = 3;

int Ticket[1000];

void deinit() 
{
   SemaphoreDeinit("TRADECONTEXT");

   return(0);
}


int start()
{
   static datetime TimeFlag = 0;
   datetime        TimeLast = Time[0];
   if(TimeFlag < TimeLast)
   {
      TimeFlag = TimeLast;
      
      int GANN = GetSignal_GANN();
      
      AnalyzeSignals(GANN);
      
      if(UseTrail == true) TrailAllOrders();
   }
   return(0);
}



void AnalyzeSignals(int GANN)
{
   static int ticket = 0;
   int sig = -1;
   bool res;
   
   ticket = RefreshTicket(ticket);
   
   if(GANN == OP_BUY)
      sig = OP_BUY;
   else if(GANN == OP_SELL)
      sig = OP_SELL;   

   if(ticket != 0)
   {
      OrderSelect(ticket, SELECT_BY_TICKET);      
      int type = OrderType();
      
      if(sig == OP_BUY && type == OP_SELL)
      {
         SemaphoreTake("TRADECONTEXT"); 
         res = OrderClose(ticket, OrderLots(), Ask, slip);
         SemaphoreReturn("TRADECONTEXT");
         if(!res) {Alert("OrderClose Error: ", GetLastError());}
         else ticket = 0;
      }
   
      else if(sig == OP_SELL && type == OP_BUY)
      {
         SemaphoreTake("TRADECONTEXT"); 
         res = OrderClose(ticket, OrderLots(), Bid, slip);
         SemaphoreReturn("TRADECONTEXT");
         if(!res) {Alert("OrderClose Error: ", GetLastError());}
         else ticket = 0;
      } 
   }   
   
   
   if(ticket == 0)
   {   
      double _lot = lots;
   
      if(sig == OP_BUY)
      {
         SemaphoreTake("TRADECONTEXT"); 
         ticket = OrderSend(Symbol(), OP_BUY, _lot, Ask, slip, Bid - StopLoss*Point, Bid + TakeProfit*Point, NULL, Magic);
         SemaphoreReturn("TRADECONTEXT");
         if(ticket < 0) {Alert("OrderSend Error: ", GetLastError());}
      }
   
      else if(sig == OP_SELL)
      {
         SemaphoreTake("TRADECONTEXT");
         ticket = OrderSend(Symbol(), OP_SELL, _lot, Bid, slip, Ask + StopLoss*Point, Ask - TakeProfit*Point, NULL, Magic);
         SemaphoreReturn("TRADECONTEXT");
         if(ticket < 0) {Alert("OrderSend Error: ", GetLastError());}
      }
   }
}

int RefreshTicket(int ticket)
{
   bool res;
   
   if(ticket <= 0)
      return(0);
   else
   {
      res = OrderSelect(ticket, SELECT_BY_TICKET);
      if(!res)
         return(0);
      else if(OrderCloseTime() != 0)
         return(0);
   }
   
   return(ticket);      //all ok, ticket still valid
}

int GetSignal_GANN()
{
   //Alert("!!: ", s1, ";", UseBeginDate, ";", BeginDate, ";", nBarsBack, ";", prices, ";", Price_Mode, ";", Show_GridMatrix, ";", Show_GannGrid, ";", Show_HiloArrows, ";", Show_PriceArrows, ";", Show_Comments, ";", ____MainGrid____, ";", MainGrid_Color, ";", MainGrid_Style, ";", MinMaxGrid_Style, ";", MainGrid_Width, ";", fontSize, ";", Draw_AllGrids, ";", Draw_AdditionalGrids, ";", ____GannGrid____, ";", GannGrid_Color, ";", GannGrid_Style, ";", GannGrid_Width, ";", ____Default_GridParameters____, ";", MainGrid_Intervals, ";", GannGrid_Interval, ";", Text_Shift);

   double ga_up = iCustom(NULL, 0, "Gann v2.0", s1, UseBeginDate, BeginDate, nBarsBack, prices, Price_Mode, Show_GridMatrix, Show_GannGrid, Show_HiloArrows, Show_PriceArrows, Show_Comments, ____MainGrid____, MainGrid_Color, MainGrid_Style, MinMaxGrid_Style, MainGrid_Width, fontSize, Draw_AllGrids, Draw_AdditionalGrids, ____GannGrid____, GannGrid_Color, GannGrid_Style, GannGrid_Width, ____Default_GridParameters____, MainGrid_Intervals, GannGrid_Interval, Text_Shift, 
                                          4, 0);
  
   double ga_dn = iCustom(NULL, 0, "Gann v2.0", s1, UseBeginDate, BeginDate, nBarsBack, prices, Price_Mode, Show_GridMatrix, Show_GannGrid, Show_HiloArrows, Show_PriceArrows, Show_Comments, ____MainGrid____, MainGrid_Color, MainGrid_Style, MinMaxGrid_Style, MainGrid_Width, fontSize, Draw_AllGrids, Draw_AdditionalGrids, ____GannGrid____, GannGrid_Color, GannGrid_Style, GannGrid_Width, ____Default_GridParameters____, MainGrid_Intervals, GannGrid_Interval, Text_Shift, 
                                          6, 0); 

   Print("ga_up = ", ga_up);
   Print("ga_dn = ", ga_dn);
   
   if(ga_up > 0.0)
      return(OP_BUY);
   else if(ga_dn > 0.0)
      return(OP_SELL);
   else
      return(-1);   
}


int TrailAllOrders()
{
   int i, total;
   
   total = CreateTicketArray(OP_BUY, Magic);
   for(i=0; i<total; i++)
      TrailingStop(Ticket[i]);

   total = CreateTicketArray(OP_SELL, Magic);
   for(i=0; i<total; i++)
      TrailingStop(Ticket[i]);
}

void TrailingStop(int ticket)
{
   int res;
   OrderSelect(ticket, SELECT_BY_TICKET);
   
   if(OrderType() == OP_BUY)
      if(TrailWhileMinus == true || Bid-OrderOpenPrice()>Point*Trail)         //не тралим, пока не можем достичь безубытка первым переносом стопа   
         if(Bid - OrderStopLoss() > Trail*Point)
         {
            SemaphoreTake("TRADECONTEXT");
            res = OrderModify(OrderTicket(), 0, Bid - Trail*Point, OrderTakeProfit(), 0);
            SemaphoreReturn("TRADECONTEXT"); 
            if(res<0)
               Alert("TrailingStop OrderModify Error: ", GetLastError());
        }
         
   if(OrderType() == OP_SELL)
      if(TrailWhileMinus == true || OrderOpenPrice()-Ask>Point*Trail)         //не тралим, пока не можем достичь безубытка первым переносом стопа
         if(OrderStopLoss() - Ask > Trail*Point)
         {
            SemaphoreTake("TRADECONTEXT");
            res = OrderModify(OrderTicket(), 0, Ask + Trail*Point, OrderTakeProfit(), 0);
            SemaphoreReturn("TRADECONTEXT");        
            if(res<0)
               Alert("TrailingStop OrderModify Error: ", GetLastError());
         }
}

int CreateTicketArray(int dir, int SysID)
{
   int total=OrdersTotal(), i, c=0; if (total<=0) return (0);
        for(i=0;i<total;i++) { OrderSelect(i, SELECT_BY_POS); if ((OrderType()==dir) && (OrderMagicNumber()==SysID)) { Ticket[c] = OrderTicket(); c++; } }
        return (c);
}

//------------------------------------------SEMAPHORE------------------------------------------

int critical = 0; 

void SemaphoreTake(string SEM)
{ 
   if(GlobalVariableCheck(SEM) == false)
      GlobalVariableSet(SEM, 0);
  
   while(1==1)
   {
      if(GlobalVariableSetOnCondition(SEM, 1.0, 0.0))         //получили доступ
      {
         critical = 1;
         Print("SEMAPHORE \"", SEM, "\" TAKEN. CURRENT VALUE: ", GlobalVariableGet(SEM));
         break;      //выходим из цикла ожидания доступа
      }
      else
      {
         Print("ATTEMPT TO CAPTURE SEMAPHORE \"", SEM, "\" FAILED. SEMAPHORE BUSY. WAITING 0.1 SEC. CURRENT VALUE: ", GlobalVariableGet(SEM));
         Sleep(100);
      }
   }
} 

void SemaphoreReturn(string SEM)
{
   GlobalVariableSet(SEM, 0.0);
   Print("SEMAPHORE \"", SEM, "\" RETURNED. CURRENT VALUE: ", GlobalVariableGet(SEM));
   critical = 0;
}

void SemaphoreDeinit(string SEM)    //Вставить в ф-ю  deinit()
{
   if(critical == 1)
   {
      GlobalVariableSet(SEM,      0.0);    //на случай, если советника убивают, пока он в процессе посылки запроса
   }  
}
 
chief2000:
Вот пример из документации команды, которая вам поможет - разберитесь с ее работой, измените параметры:

High[iHighest(NULL,0,MODE_HIGH,20,4)];
Low[iLowest(NULL,0,MODE_LOW,10,10)];


СПАСИБО
 
chief2000:
Вот пример из документации команды, которая вам поможет - разберитесь с ее работой, измените параметры:

High[iHighest(NULL,0,MODE_HIGH,20,4)];
Low[iLowest(NULL,0,MODE_LOW,10,10)];


Извини, что запоздал с ответом, проблемы с компом были.
 
chief2000:
Вот пример из документации команды, которая вам поможет - разберитесь с ее работой, измените параметры:

High[iHighest(NULL,0,MODE_HIGH,20,4)];
Low[iLowest(NULL,0,MODE_LOW,10,10)];


Извини, что запоздал с ответом, проблемы с компом были.
 
al7bar:

Посмотрите пожалуйста код советника, не могу понять в чем причина.... При первом запуске торгует может сразу открыть сделку, но после закрытия перестает работать, до следующего перезапуска терминала или вкл/выкл разрешить советнику торговлю... Работает по индикатору Gann 2.0

Явных ошибок в логике не видно. Принтуйте код пошагово. Процедура торговли завязана на значение переменной ticket. В первую очередь отследите её изменения. А также обратите внимание на значение глобальной переменной терминала "TRADECONTEXT" - её значение должно быть равно 0.
 
TarasBY:

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

P.S. А для начала обратите внимание на наименование переменных, а точнее на их префиксы. Переменные, имеющие начальную b, например, bs_Symbol объявлены на глобальном уровне из библиотеки. Большинство глобальных переменных объявлены в b-PSI@Base.


 Игорь, я это понял. Но суть в том, что, как я понимаю, чтоб получить рыночную информацию по заданному инструменту, не нужно вообще привязывать к ордеру. Если инструмент есть, то ордер тут уже не нужен... Вообще не нужен. Ведь, чтоб получить рыночную информацию нужно лишь название инструмента... Вы не согласны?

 Данная переменная, о которой я выше спрашивал bs_Symbol впервые упоминается во включении b-PSY@Base.mqh, Вот строка:

  bs_Symbol,                            // текущий инструмент

 Но, ей ничего не присвоено. Тогда:

if (fs_Symbol != bs_Symbol || fi_Ticket < 0)

 Тут выражение:

fs_Symbol != bs_Symbol

 Нужно понимать как: fs_Symbol != 0 верно? 

 

TarasBY:

P.S. А для начала обратите внимание на наименование переменных, а точнее на их префиксы. Переменные, имеющие начальную b, например, bs_Symbol объявлены на глобальном уровне из библиотеки. Большинство глобальных переменных объявлены в b-PSI@Base. 


Хм. Обычно я у себя через g_ обозначаю глобальные переменные (от слова global) А через l (например, li_cnt) у Вас это локальные означает?
 

Друзья! Нужна помощь в доработке советника.

Имеется программный код, который при определённом условии if открывает ордер. Исполнение условия может происходить каждый тик, так как помещён в теле int start().

Нужно:

1. После выполнения условия (и открытия ордера) сделать паузу на открытие новых ордеров, пауза n баров. Например если советник стоит на таймфрейме М30 и мне нужно пропустить 3 часа, то пауза должна быть 6 баров.

2. Программа должна работать в тестере стратегий.

Какой нужен код. И куда будет правильнее его вставить.

int start()
  { 
   ...

   if (...)                                                          //условие
      {
       OrderSend(Symbol(),OP_BUY,lot,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
       ...
      }

   ...
  }
 
hoz:


 Игорь, я это понял. Но суть в том, что, как я понимаю, чтоб получить рыночную информацию по заданному инструменту, не нужно вообще привязывать к ордеру. Если инструмент есть, то ордер тут уже не нужен... Вообще не нужен. Ведь, чтоб получить рыночную информацию нужно лишь название инструмента... Вы не согласны?

 Данная переменная, о которой я выше спрашивал bs_Symbol впервые упоминается во включении b-PSY@Base.mqh, Вот строка:

 Но, ей ничего не присвоено. Тогда:

 Тут выражение:

 Нужно понимать как: fs_Symbol != 0 верно? 

 


Хм. Обычно я у себя через g_ обозначаю глобальные переменные (от слова global) А через l (например, li_cnt) у Вас это локальные означает?

Вам ещё очень многое предстоит узнать. Пока Ваши предположения не соответствуют действительности. Мои функции одновременно могут исполнять различное предназначение (в целях уменьшения самого кода), в частности fGet_MarketInfo(). Всё неоднократно продумано и ничего изменять НЕ НУЖНО!

А начните, например, с эксперимента: объявите в теле советника какую либо глобальную переменную и попытайтесь эту переменную вызвать из подсоединённой библиотеки. Полученные результаты попытайтесь связать с наименованием переменных, которые имеют префикс, начинающийся на b, например, bs_Symbol.

P.S. Меня не нужно проверять: Вы или пользуетесь моими библиотеками, или не пользуетесь. Если что-то (какая-то моя библиотека) работает не верно - поставьте меня в известность, и я исправлю. А чтобы задавать вопросы - "Почему она так работает?" - нужно знаний поболе, потому, что "очевидность не лежит на поверхности".

 
TarasBY:

Вам ещё очень многое предстоит узнать. Пока Ваши предположения не соответствуют действительности. Мои функции одновременно могут исполнять различное предназначение (в целях уменьшения самого кода), в частности fGet_MarketInfo(). Всё неоднократно продумано и ничего изменять НЕ НУЖНО!

Понимаю, что там. Но не понятно почему реализовано именно так..

 

TarasBY:

А начните, например, с эксперимента: объявите в теле советника какую либо глобальную переменную и попытайтесь эту переменную вызвать из подсоединённой библиотеки. Полученные результаты попытайтесь связать с наименованием переменных, которые имеют префикс, начинающийся на b, например, bs_Symbol. 

В исходном виде всё-равно не получится пользоваться Вашими библиотеками, т.е. у Вас там всё повязано. Каждая функция на пачке других.. 

 

TarasBY:

P.S. Меня не нужно проверять: Вы или пользуетесь моими библиотеками, или не пользуетесь. Если что-то (какая-то моя библиотека) работает не верно - поставьте меня в известность, и я исправлю. А чтобы задавать вопросы - "Почему она так работает?" - нужно знаний поболе, потому, что "очевидность не лежит на поверхности".

Я, ни в коем случае, не хотел проверять.. Даже более того, сомнений нет, что написано всё очень грамотно. Просто я не совсем всё понимаю, поэтому и сказал, что я думаю, не совсем так.. Смотрю, думаю.. НО не всё понимаю. Вот и спросил.

P.S. С  bs_Symbol я так и не понял.

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