Новая статья: Три аспекта ручного автотрейдинга. Часть 1 - Торговля

 

Опубликована статья Три аспекта ручного автотрейдинга. Часть 1 - Торговля:

Эта статья открывает цикл статей по вопросам автоматизации ручного трейдинга на платформе МetaТrader 4. Каждая из них будет посвящена одному отдельному аспекту ручного автотрейдинга: автоматизация ручной торговли, автоматизация отображения текущего состояния торговли и автоматизация формирования отчетов о результатах торговли. В этой статье я расскажу об одной интересной технике для написания советников, управляемых трейдером вручную.

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

Для осознанного восприятия ролика пока достаточно будет понимать, что в терминале работает эксперт, которым управляют с помощью сброса в окно терминала управляющих скриптов. Сам по себе эксперт не торгует, он только и умеет, что подтягивать стоп-уровни (Stop Loss и Take Profit) в трейлинге, но делать это начинает так же по команде трейдера. Названия скриптов очевидно соответствуют выполняемым действиям, а всплывающие подсказки поясняют их использование.


Автор: Sergey Kravchuk
 

Доброго времени суток,

у меня функции исполняются експертом при помощи сдвига обьектов на графике.

примерно так:

 

 if(ObjectGet(WindowExpertName()+"label"+4,OBJPROP_XDISTANCE)!=5{OpenPosition(Symbol(),OP_BUY,lot,0,0,magic);} 

пока всё работает без сбоев. в программировании не силён, поэтому вопрос к программистам: могут ли быть, при такой реализации какие либо сбои в работе? и при каких обстоятельствах?

Благодарю. 

 
abdul1:

Доброго времени суток,

у меня функции исполняются експертом при помощи сдвига обьектов на графике.

примерно так:

 

пока всё работает без сбоев. в программировании не силён, поэтому вопрос к программистам: могут ли быть, при такой реализации какие либо сбои в работе? и при каких обстоятельствах?

Благодарю. 


Да при таком коде проблемы будут обязательно ,

Посмотрите сами если ваш объект по икс координате  не равен 5  открывать (посылать запросы ) пока обьект не вернется на место ,

так вот за момент пока обьект не равен 5 может отправиться 1-10000 запросов и часть может выполниться

Я то же писал подобный полуавтомат ... 

 

спасибо за ответ. 

Это вроде я предусмотрел.

 

int init()  {//функция инициализации советника
  Createlabel(4,Green,12,"OP_BUY");
  Createlabel(3,Red,12,"OP_SELL");
  Createlabel(2,Green,12,"OP_BUYLIMIT");
  Createlabel(1,Red,12,"OP_SELLLIMIT");
  Createlabel(0,White,12,"DELETE_LIMIT");      
             } // ========= конец функции 


//============================= Функция СТАРТ =====================================+
void start() {
 
  
  if(ObjectFind(WindowExpertName()+"label"+4)!=-1)//на всякий случай
    {
  if(ObjectGet(WindowExpertName()+"label"+4,OBJPROP_XDISTANCE)!=5{OpenPosition(Symbol(),OP_BUY,lot,0,0,magic);}
  if(ObjectGet(WindowExpertName()+"label"+3,OBJPROP_XDISTANCE)!=5{OpenPosition(Symbol(),OP_SELL,lot,0,0,magic);}
  if(ObjectGet(WindowExpertName()+"label"+2,OBJPROP_XDISTANCE)!=5{SetOrder(Symbol(),OP_BUYLIMIT,lot,0,0,magic,0);}
  if(ObjectGet(WindowExpertName()+"label"+1,OBJPROP_XDISTANCE)!=5{SetOrder(Symbol(),OP_SELLLIMIT,lot,0,0,magic,0);}
  if(ObjectGet(WindowExpertName()+"label"+0,OBJPROP_XDISTANCE)!=5){DeleteOrders(Symbol(),op1,magic);}
    }
  
  Createlabel(4,Green,12,"OP_BUY");
  Createlabel(3,Red,12,"OP_SELL");
  Createlabel(2,Green,12,"OP_BUYLIMIT");
  Createlabel(1,Red,12,"OP_SELLLIMIT");
  Createlabel(0,White,12,"DELETE_LIMIT");
}

после отправки ордера он ставит обьект обратно. 

пока вроде как всё работает.  что ещё может произойти? 

ваш полуавтомат пользуете? или непрактичен такой подход? 

 

Много чего, но речь, как я понимаю, о ситуации, когда: 

 ObjectGet(WindowExpertName()+"label"+4,OBJPROP_XDISTANCE)=5.000000000000000000000000000001

 
tara:

Много чего

можно пару примеров? 

tara:

но речь, как я понимаю, о ситуации, когда: 

 ObjectGet(WindowExpertName()+"label"+4,OBJPROP_XDISTANCE)=5.000000000000000000000000000001

ах, и такое может быть!!! поставил условие >6.

ведь после исполнения услаовия OpenPosition,  Createlabel ставит обьект на место. условие не может выполняться несколько раз прежде чем Createlabel.

в чём я заблуждаюсь?

сделал вот так:

if(ObjectFind(WindowExpertName()+"label"+4)!=-1)
    {
    if(ObjectGet(WindowExpertName()+"label"+4,OBJPROP_XDISTANCE)>6)
      {
      OpenPosition(Symbol(),OP_BUY,GlobalVariableGet("lot"+txt+magic),0,0,magic);
      Createlabel(4,Green,12,"OP_BUY");
      }
    if(ObjectGet(WindowExpertName()+"label"+3,OBJPROP_XDISTANCE)>6)
      {
      OpenPosition(Symbol(),OP_SELL,GlobalVariableGet("lot"+txt+magic),0,0,magic);
      Createlabel(3,Red,12,"OP_SELL");
      }
    if(ObjectGet(WindowExpertName()+"label"+2,OBJPROP_XDISTANCE)>6)
      {
      SetOrder(Symbol(),OP_BUYLIMIT,GlobalVariableGet("lot"+txt+magic),NormalizeDouble(GlobalVariableGet("srd"+txt+magic),Digits),0,0,magic,0);
      Createlabel(2,Green,12,"OP_BUYLIMIT");
      }
    if(ObjectGet(WindowExpertName()+"label"+1,OBJPROP_XDISTANCE)>6 && GlobalVariableGet("lot"+txt+magic)>0)
      {
      SetOrder(Symbol(),OP_SELLLIMIT,GlobalVariableGet("lot"+txt+magic),NormalizeDouble(GlobalVariableGet("srd"+txt+magic),Digits),0,0,magic,0);
      Createlabel(1,Red,12,"OP_SELLLIMIT");
      }
    if(ObjectGet(WindowExpertName()+"label"+0,OBJPROP_XDISTANCE)>6)
      {
      DeleteOrders(Symbol(),op1,magic);
      Createlabel(0,White,12,"DELETE_LIMIT");
      }
    }
  
  Createlabel(4,Green,12,"OP_BUY");
  Createlabel(3,Red,12,"OP_SELL");
  Createlabel(2,Green,12,"OP_BUYLIMIT");
  Createlabel(1,Red,12,"OP_SELLLIMIT");
  Createlabel(0,White,12,"DELETE_LIMIT");

 

 наверно уже боятся нечего?

 

Наверное, нечего, если ошибки обрабатываются надлежащим образом, а это не так. 

Функция перевыставления объектов должна вызываться из функций управления позициями, имхенько.  

Ну, или ее вызов должен быть обусловлен результатами исполнения последних.  

 
tara:

Наверное, нечего, если ошибки обрабатываются надлежащим образом, а это не так. 

Функция перевыставления объектов должна вызываться из функций управления позициями, имхенько.  

Ну, или ее вызов должен быть обусловлен результатами исполнения последних.  


дельные советы. спасибо.
Причина обращения: