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

 

Выдает массу ошибок


 

Извините, alex12, но Вы похожи на быдлокодера (без оскорблений, это принятый термин). Составляете абы что из разных кусочков и кое-как добиваетесь того, чтобы компилилось, но не понимая смысла кода.

Обращайтесь в сервис Работа.

 
alex12:

Выдает массу ошибок


Используя некоторые функции Игоря Кима, потрудитесь иметь в наличии его же, недостающие в вашем коде функции, о которых вам компилятор сообщает. Найдите их у него в ветке и пропишите в свой код.
 
chief2000:
...

OrderOpenTime() показывает время открытия позиции, вопрос - как узнать время, когда был установлен СТОП-ордер?
В отчете МТ4 это время имеется, а можно ли узнать его из кода?


Еще раз.

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

if ((orderType != OP_BUY) && (orderType != OP_SELL)) continue;

или замените ее на данные с интересующих Вас стоповых отложек...

int orderCount = 0; // сбрасываем счетчик ордеров 
      // ------------------------------------------------Считаем только наши ордера---------------------------
   int orderType;
   for (orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
   {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))     continue; // если ордер не выбран, то идем на следующий открытый
      if(OrderCloseTime()!=0) continue;                          // если тикет принадлежит закрытому ордеру, то берем следующий открытый
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))   continue;
      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL))   continue;
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          orderProfit = OrderProfit() + OrderSwap();       // Profit
          Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера 
          Time = OrderOpenTime();
         
                     
         
      orderCount++;                     // считаем ордера (не больше i)           

    }   
 
Roman.:


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

if ((orderType != OP_BUY) && (orderType != OP_SELL)) continue;

или замените ее на данные с интересующих Вас стоповых отложек...

Вот на этом этапе я столкнулся с дилеммой - время открытия СТОП-ордера мне нужно для некоторой "статистики" и я бы не хотел чтобы этот процесс был запущен все время, а лишь на определенном финальном этапе. По этой причине необходимо перебирать не ордера открытые в данный момент (OrdersTotal() ), а искать среди уже закрытых ордеров => OrdersHistoryTotal().
Но для уже закрытых СТОП-ордеров OrderOpenTime() возвращает не время когда ордер был установлен, а время открытия позиции.
В итоге, все сводится к тому - можно ли для СТОП-ордеров из списка OrdersHistoryTotal() извлечь время, когда они были установлены?
 
chief2000:
Вот на этом этапе я столкнулся с дилеммой - время открытия СТОП-ордера мне нужно для некоторой "статистики" и я бы не хотел чтобы этот процесс был запущен все время, а лишь на определенном финальном этапе. По этой причине необходимо перебирать не ордера открытые в данный момент (OrdersTotal() ), а искать среди уже закрытых ордеров => OrdersHistoryTotal().
Но для уже закрытых СТОП-ордеров OrderOpenTime() возвращает не время когда ордер был установлен, а время открытия позиции.
В итоге, все сводится к тому - можно ли для СТОП-ордеров из списка OrdersHistoryTotal() извлечь время, когда они были установлены?

Да... Задачка... ХЗ. Похоже, нельзя - особенно на "финальном этапе"...

Надо постоянно мониторить этот процесс и отслеживать - см. пост FAQ на пред. страничке.

 
Roman.:

Да... Задачка... ХЗ. Похоже, нельзя - особенно на "финальном этапе"...

Надо постоянно мониторить этот процесс и отслеживать - см. пост FAQ на пред. страничке.

Если другого решения не найдется то буду использовать ордера из OrdersTotal().
В любом случае Спасибо!
 
В таком случае, легче писать в файл, гемору меньше, и статистику можно организовать, так как надо вам, а не терминалу.
 
FAQ:
В таком случае, легче писать в файл, гемору меньше, и статистику можно организовать, так как надо вам, а не терминалу.
Спасибо!
 

хочу написать советник по патерну Пинцет.

условием открытия выбрал

Low2=Low[iLowest(NULL,0,MODE_LOW,10,2)]    
High2=High[iHighest(NULL,0,MODE_HIGH,10,2)]     

if(Low[1]==Low2) bull_pincet=true;
if(High[1]==High2) bear_pincet=true;

   while(true)
      {
       
       if(Total==0 && bull_pincet==true)
        {
         sl=Low[1];
         if(sl<Step)sl=Step;
         tp=Ask+((Ask-sl)*k);
                  
         OrderSend(Symb,OP_BUY,Lts,Ask,3,sl,tp);
         return;
        }

        if(Total==0 && bear_pincet==true)
         {
          sl=High[1];
          if(sl<Step)sl=Step;
          tp=Bid-((sl-Bid)*k);
          OrderSend(Symb,OP_SELL,Lts,Bid,3,sl,tp);
          return;
         }
       break;
      }   

к моему сожалению условие оказалось не верным, тк, 'sl' устанавливается на цену 100.00000, а 'tp' вообще показывает ошибку.

решил добавить условие, учитывать 1 тик.

static datetime TimeSaveH1  = 0;
int init()
{
     TimeSaveH1  = iTime( Symbol(), Period(), 0); // берем открытия время текущего бара
}

int start()
{
         if (TimeSaveH1!=iTime( Symbol(), Period(), 0))
            {
               TimeSaveH1=iTime( Symbol(), Period(), 0); 
            }  

Low2=Low[iLowest(NULL,0,MODE_LOW,10,2)]    
High2=High[iHighest(NULL,0,MODE_HIGH,10,2)]     

if(Low[1]==Low2 && TimeSaveH1===iTime( Symbol(), Period(), 0) bull_pincet=true;
if(High[1]==High2 && TimeSaveH1===iTime( Symbol(), Period(), 0) bear_pincet=true;
   while(true)
      {
       
       if(Total==0 && bull_pincet==true)
        {
         sl=Low[1];
         if(sl<Step)sl=Step;
         tp=Ask+((Ask-sl)*k);
                  
         OrderSend(Symb,OP_BUY,Lts,Ask,3,sl,tp);
         return;
        }

        if(Total==0 && bear_pincet==true)
         {
          sl=High[1];
          if(sl<Step)sl=Step;
          tp=Bid-((sl-Bid)*k);
          OrderSend(Symb,OP_SELL,Lts,Bid,3,sl,tp);
          return;
         }
       break;
      }   




}

результат тотже. как правильно решить мою задачу?

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