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

 
artmedia70:

ИМХО - лучше найти поиском свой ордерочек и посмотреть - в рынкете он иль закрылся и как закрылся, по тейку, по стопу или вручную. Отсюда дальше и плясать в разные стороны.

Тогда уж точно всё будет точно. А глобальные переменные можно и потерять...


Поясни пожалуйста, что значит потерять переменные? а найти в смысле тоже чтобы советник это проверял?
 
Begemot7:
Поясни пожалуйста, что значит потерять переменные? а найти в смысле тоже чтобы советник это проверял?

Я во всех советниках для реала и демо не храню никакие важные данные по ордерам и позициям в переменных. Максимум, куда я могу записать данные, необходимые для логики советника - в комментарий ордера. Когда мне нужно найти, есть ли позиции, сколько их, есть ли ордера, закрытые позиции, как они закрылись, я делаю цикл по рыночным позициям/ордерам или по историческим данным, нахожу нужный мне ордер и извлекаю нужную мне информацию. Таким образом, у меня вся важная информация не хранится в переменных, так как она может потеряться при неожиданном отключении компьютера. Её всегда можно потом извлечь. Как-то пробовал хранить её в глобальных переменных терминала - оказалось, что не всегда туда сохраняется информация при отключении/зависании компьютера. А постоянно следить за записью туда свежей информации для меня муторно как-то... Мне проще найти то, что мне нужно в тот момент, когда оно мне потребовалось.
 
PapaYozh:

Получить координаты точки, на которую был брошен индикатор, можно при помощи функций:

WindowXOnDropped() 

WindowYOnDropped() 

Цену и время: 

WindowPriceOnDropped()

WindowTimeOnDropped() 

 


Попробую, встроить. Пример бы похожий...
 

Столкнулся со странной ситуацией. Подскажите пожалуйста...

Есть три самописных советника. Стратегия одна, просто чуть разные реализации, в зависимости от инструмента. Пары: EURUSD, EURGBP и USDJPY. С первыми двумя все ок, последний - не торгует. Брокер - FX-Trend. Счет - мини, с минимальным лотом 0.01 (собственно, столько пока и стоит - для тестов).

При этом: на демо-счете все ок. При запуске в тестере на том же самом реальном счете в тестере сделки открываются. А при реальной работе - нет. Графические маркеры открытия ордера (и все прочие) - ставятся успешно. В логах - абсолютно ничего.

Крутится все это на VPS.


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

 
Sepulca:

А лучше вот так ( на случай перезапуска советника):



Если ордер только один и будет один, то можно обойтись.


if(OrdersTotal()<1)

{

}

......

 
artmedia70:
Я во всех советниках для реала и демо не храню никакие важные данные по ордерам и позициям в переменных. Максимум, куда я могу записать данные, необходимые для логики советника - в комментарий ордера. Когда мне нужно найти, есть ли позиции, сколько их, есть ли ордера, закрытые позиции, как они закрылись, я делаю цикл по рыночным позициям/ордерам или по историческим данным, нахожу нужный мне ордер и извлекаю нужную мне информацию. Таким образом, у меня вся важная информация не хранится в переменных, так как она может потеряться при неожиданном отключении компьютера. Её всегда можно потом извлечь. Как-то пробовал хранить её в глобальных переменных терминала - оказалось, что не всегда туда сохраняется информация при отключении/зависании компьютера. А постоянно следить за записью туда свежей информации для меня муторно как-то... Мне проще найти то, что мне нужно в тот момент, когда оно мне потребовалось.

Всё правильно... дополнительно перестраховаться. Правильней конечно перебирать все ордера. Но тут конкретный случай. И уж если потерялись GlobalVariables то нужно уходить с этого ДЦ. GlobalVariables хранятстся не у Вас на компьютере, а в недрах ДЦ до трёх месяцов если Вы их не трогаете. Или я не прав?
 
Похоже, я таки сам разобрался :). Точно говорят - главное сформулировать. В общем, при исполнении по рынку стоп и тейк указываем нулевыми. А затем уже выставляем как надо. Может, кому пригодится...
 
Sepulca:
Всё правильно... дополнительно перестраховаться. Правильней конечно перебирать все ордера. Но тут конкретный случай. И уж если потерялись GlobalVariables то нужно уходить с этого ДЦ.

В смысле это специально ДЦ делает? Мне сказали, что МТ4 это терминал, который легко можно контролироваться брокером и следовательно возможно много мухлевания, кто про это слышал?
 
Begemot7:

В смысле это специально ДЦ делает? Мне сказали, что МТ4 это терминал, который легко можно контролироваться брокером и следовательно возможно много мухлевания, кто про это слышал?


Я не очень понимаю.. Какой смысл ДЦ уничтожать Ваши глобальные переменные, если, конечно, Вы не наплодили их х...... тучу. Цитата из документации:
"Не следует путать глобальные переменные клиентского терминала с переменными, объявленными на глобальном уровне MQL4-программы.Глобальные переменные существуют в клиентском терминале 4 недели с момента последнего обращения, после этого автоматически уничтожаются. Обращением к глобальной переменной считается не только установка нового значения, но и чтение значения глобальной переменной.Глобальные переменные клиентского терминала доступны одновременно из всех MQL4-программ, запущенных на клиентском терминале." Если Вы  работаете с лотом 0.01 или 0.1 не будет Вас никто гнобить, потому-что это мелочь.... А вот если Вы открыли 100 лотов на реале, будьте готовы к борьбе за свою денюжку.

 

Нужна помощь профи!!! Уже голову сломал этим кодом... Есть 4 буфера 2 из них работают корректно (Buffer &buffer2), а вот остальные 2 нет. При наступление некого условия буфер заполняется, при преодаление этой величины вверх для оного и вниз для второго, буфера удаляются (обнуляются), а вот остальные 2 буфера все равно висят в чарте. Подскажите как поправить?

      //--- Функция расчета буферов CountZZ(BuferUp,BuferDn,iPeriod,Dev,Step);
int CountZZ( double& ExtMapBuffer[], double& ExtMapBuffer1[], double& ExtMapBuffer2[], double& ExtMapBuffer3[], int ExtDepth, int ExtDeviation, int ExtBackstep )
{
   int    shift, back,lasthighpos,lastlowpos;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow,lastlow1,lasthigh1;
   int count = iBars(pair,tf)-ExtDepth;

   for(shift=count; shift>=0; shift--)
     {
     //--- Расчитываем буфер BuferUp
      val = iLow(pair,tf,iLowest(pair,tf,MODE_LOW,ExtDepth,shift));
      if(val==lastlow) val=0.0;
      else
        {
         lastlow=val;
         if((iLow(pair,tf,shift)-val)>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer[shift+back];
               if((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0.0;
              }
           }
        }
       
          ExtMapBuffer[shift]=val;
      //--------------------------------------------------------------------    
          
     //--- Расчитываем буфер BuferUp2
      if (ExtMapBuffer[shift]>0.0)
      {
             if(use.narrow.bands) val = MathMin(iClose(pair,tf,shift),iOpen(pair,tf,shift));
                else {val = MathMax(iClose(pair,tf,shift),iOpen(pair,tf,shift));
             val = MathMin(val,MathMin(iHigh(pair,tf,shift+1),iHigh(pair,tf,shift-1)));}
      if(ExtMapBuffer[shift+back]==0.0) ExtMapBuffer1[shift+back]=0.0;
      } 
          ExtMapBuffer1[shift]=val;
      //--------------------------------------------------------------------    
          
      //--- Расчитываем буфер BuferDn
      val=iHigh(pair,tf,iHighest(pair,tf,MODE_HIGH,ExtDepth,shift));
     
      if(val==lasthigh) val=0.0;
      else
        {
         lasthigh=val;
         if((val-iHigh(pair,tf,shift))>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer2[shift+back];
               if((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0.0;
              }
           }
        }
      ExtMapBuffer2[shift]=val;
      //-------------------------------------------------------------------
      
      //--- Расчитываем буфер BuferDn2
      if (ExtMapBuffer2[shift]>0.0)
      {
             if(use.narrow.bands) val = MathMax(iClose(pair,tf,shift),iOpen(pair,tf,shift));
                else {val = MathMin(iClose(pair,tf,shift),iOpen(pair,tf,shift));
             val = MathMax(val,MathMax(iLow(pair,tf,shift-1),iLow(pair,tf,shift+1)));}
      if(ExtMapBuffer2[shift+back]==0.0) ExtMapBuffer3[shift+back]=0.0;
      }
      ExtMapBuffer3[shift]=val;
      //-------------------------------------------------------------------
      
     }
           
   // Отсееваем ненужные значения
   lasthigh=-1; lasthighpos=-1;
   lastlow=-1;  lastlowpos=-1;

   for(shift=count; shift>=0; shift--)
     {
      curlow=ExtMapBuffer[shift];
      curhigh=ExtMapBuffer2[shift];
      if((curlow==0)&&(curhigh==0)) continue;
      //---
      if(curhigh!=0)
        {
         if(lasthigh>0)
           {
            if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
            else ExtMapBuffer2[shift]=0;
           }
         //---
         if(lasthigh<curhigh || lasthigh<0)
           {
            lasthigh=curhigh;
            lasthighpos=shift;
           }
         lastlow=-1;
        }
      //----
      if(curlow!=0)
        {
         if(lastlow>0)
           {
            if(lastlow>curlow) ExtMapBuffer[lastlowpos]=0;
            else ExtMapBuffer[shift]=0;
           }
         //---
         if((curlow<lastlow)||(lastlow<0))
           {
            lastlow=curlow;
            lastlowpos=shift;
           }
         lasthigh=-1;
        }
     }
 
   for(shift=iBars(pair,tf)-1; shift>=0; shift--)
   {
      if(shift>=count) ExtMapBuffer[shift]=0.0;
         else
         {
            res=ExtMapBuffer2[shift];
            if(res!=0.0) ExtMapBuffer2[shift]=res;
         }
   }
}

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