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

 
xant:

Еще теоретический вопрос.

Переменные при их объявлении в советнике имеют нулевое значение. Предположим, советник проработал неделю, переменные поменяли свое значение, и вот мне понадобилось внести изменения в код советинка. Я вношу изменения, перекомпилирую, запускаю торговлю. Вопрос такой: какие значения будут у глобальных переменных? Нулевые или те, что были ранее до компиляции? 


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

rigonich

отлично! Наконец я получил что нужно! 

Всем спасибо, и даже Тарасу! ))) 

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

МИСТИКА!!!

 

вот это

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


pp_sell=(-(PriceOpenLastClosePos()-PriceCloseLastPos())*100000); // для валют с размерностью ЕВРО


 Print (pp_sell);

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

Принтует -10  , как и положено ибо последняя сделка SELL имеет профит 10

НО ЕСЛИ ВСТАВИТЬ НЕСКОЛЬЕО НИЧЕГО НЕ МЕНЯЮЩИХ УСЛОВИЙ МЕЖДУ ПРИНТОМ И  переменнмыми, например вот так

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


pp_sell=(-(PriceOpenLastClosePos()-PriceCloseLastPos())*100000); // для валют с размерностью ЕВРО


if ( Hour()>=10 && Hour()<20)

  {

    if ( Stoch_1>Stoch_2)  return(0);

else {

           if (OrdersTotal()==0)   

          { PlaySound("ok.wav");

           if ( GetTypeLastClosePos()==1) Print (pp_sell);

          }

Print("___");

 }

}

return(0); 

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

то все работает, но принтует -9 !!!!

в чем секрет?  

 
а при переоткрытии сделки - результат повторяется с постоянной разницей в 1пп. !!!! т.е какой  бы ни был профит последней сделки - первый вариант принтуется на 1 больше второго! 
 
lottamer:


да вот как этот момент мне хорошо известен...

напишите плиз, кусочек с запросом тикета последней сделики из истории...а я по нему поймаю логику... 

 



int fLastClosetPoz()
   {
   int Tot=OrdersHistoryTotal(),Ticket=-1; datetime time=0; 
   if(Tot>0)
      {
      for(int i=0;i<OrdersHistoryTotal();i++)
         {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
            {
            if(OrderSymbol()==Symbol())
               {
               if(OrderCloseTime()>time)
                  {
                  time=OrderCloseTime();Ticket=OrderTicket();
               } 
            }
         }
         else continue;
      }
   }
   return(Ticket);
}

 
lottamer:

МИСТИКА!!!

 

вот это

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


pp_sell=(-(PriceOpenLastClosePos()-PriceCloseLastPos())*100000); // для валют с размерностью ЕВРО


 Print (pp_sell);

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

Принтует -10  , как и положено ибо последняя сделка SELL имеет профит 10

НО ЕСЛИ ВСТАВИТЬ НЕСКОЛЬЕО НИЧЕГО НЕ МЕНЯЮЩИХ УСЛОВИЙ МЕЖДУ ПРИНТОМ И  переменнмыми, например вот так

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


pp_sell=(-(PriceOpenLastClosePos()-PriceCloseLastPos())*100000); // для валют с размерностью ЕВРО


if ( Hour()>=10 && Hour()<20)

  {

    if ( Stoch_1>Stoch_2)  return(0);

else {

           if (OrdersTotal()==0)   

          { PlaySound("ok.wav");

           if ( GetTypeLastClosePos()==1) Print (pp_sell);

          }

Print("___");

 }

}

return(0); 

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

то все работает, но принтует -9 !!!!

в чем секрет?  


Вы работаете с ненормализованными значениями типа дабл. в таких случаях неточности вычислений накапливаются и могут в конечном итоге становится значимыми. ведь это вы думаете, что вставляете  НИЧЕГО НЕ МЕНЯЮЩИЕ УСЛОВИЯ, на самом деле вы заставляете компьютер производить ненужные вычисления, да и условия ваши не   НИЧЕГО НЕ МЕНЯЮЩИЕ . 

И вы уверены, что функции PriceOpenLastClosePos() и PriceCloseLastPos() возващают значения для одной и той же позиции?

 
rigonich:


int fLastClosetPoz()                                                                                      

   {
   int Tot=OrdersHistoryTotal(),Ticket=-1; datetime time=0;                          
   if(Tot>0)
      {
      for(int i=0;i<OrdersHistoryTotal();i++)
         {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
            {
            if(OrderSymbol()==Symbol())
               {
               if(OrderCloseTime()>time)
                  {
                  time=OrderCloseTime();Ticket=OrderTicket();
               } 
            }
         }
         else continue;
      }
   }
   return(Ticket);
}


начиная с  if(OrderCloseTime()>time)... далее непонятно что откуда берется...ну да ладно...

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

первый я просто пишу Print  LastClosetPoz()

взять  2й (i) ?      OrderSelect(2,SELECT_BY_POS,MODE_HISTORY)....??

Print LastClosetPoz(2) ?? явная ошибка, но было бы логично :))) 

 

пытаюсь вместо OrderTicket в строке Ticket=OrderTicket(); поставить другие параметры закрытой сделки (цены открытия закрытия стопы тейи) -не дает. принтует единицу 

 
rigonich:

Вы работаете с ненормализованными значениями типа дабл. в таких случаях неточности вычислений накапливаются и могут в конечном итоге становится значимыми. ведь это вы думаете, что вставляете  НИЧЕГО НЕ МЕНЯЮЩИЕ УСЛОВИЯ, на самом деле вы заставляете компьютер производить ненужные вычисления, да и условия ваши не   НИЧЕГО НЕ МЕНЯЮЩИЕ .  


не жирно ли для компьютера за 4 строчки накопить целых 10% погрешности??? :))))))))))) (на больших числах - меньше 10%)

 1) что там копить, если закрытый ордер фиксирован, и все его параметры "не плавают"?

2) условия НИКАК не касались расчета выводимого параметра. Они были лишь шлагбаумом -пустить-не пустить...  

 3) и почему тогда результат не плавает в пределах работы одного советника, а плавает от одного к другому?

 
lottamer:


начиная с  if(OrderCloseTime()>time)... далее непонятно что откуда берется...ну да ладно...

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

взять  2й (i) ?      OrderSelect(2,SELECT_BY_POS,MODE_HISTORY)....??

 1. напишите плиз, кусочек с запросом тикета последней сделики из истории..  --ваш вопрос.

2.Чтобы найти предпоследний,надо запомнить тикет последнего(напимер, в переменной, допустим А) , еще раз запустить цикл, и "пропуcтить" этот ордер.То есть, например, изменить строчку

if(OrderSymbol()==Symbol()) на if(OrderSymbol()==Symbol()&&OrderTicket()!=A), или добавить строчку if(Ticket()!=A)continue;

И я вам уже объяснял,что индекс ордера  не всегда будет совпадать с тем, каким по счету он закрыт, так как рыноные и отложенные ордера учитываются вместе, и последние не имеют цены закрытия, поэтоу для нахождения последнего закрытого ордера и перебираются в цикле все ордера, и ищется ордер, с самым большим временем закрытия.То есть последний закрытый вполне может иметь индекс, например, 3, а предпоследний --7.