Доливка скриптом

 

Поскольку решительного прорыва в автоторговле не достиг, приходится поправлять советника ручками. Для выставления вручную дополнительных ордеров хотелось бы использовать скрипт, который сам впишет в ордер магик советника, чтобы советник эти ордера подхватил. А для этого он должен узнать название советника, работающего на этом чарте, дальше дело техники. Усложнять советник глобальными переменными не хочется.

Вопрос: как скрипт может узнать имя советника, работающего на чарте?

 
Виктор, не это WindowExpertName( ) случаем?
 

В принципе это можно сделать в любом скрипте... добавив туда:

extern int MGiK=12345;
// ...
ticket=OrderSend(Sim,OP,Lots,cena,slipp,loss,profit,txt,MGiK,0,CLR_NONE);
 
goldtrader писал(а) >>
Виктор, не это WindowExpertName( ) случаем?

Это не то. Это собственное имя файла, т.е. будет имя скрипта.

 
granit77 писал(а) >>

Поскольку решительного прорыва в автоторговле не достиг, приходится поправлять советника ручками. Для выставления вручную дополнительных ордеров хотелось бы использовать скрипт, который сам впишет в ордер магик советника, чтобы советник эти ордера подхватил. А для этого он должен узнать название советника, работающего на этом чарте, дальше дело техники. Усложнять советник глобальными переменными не хочется.

Вопрос: как скрипт может узнать имя советника, работающего на чарте?

Никак. Пусть эксперт создает надпись (LABEL) со своими именем (WindowExpertName( )) или сразу с магиком, а скрипт найдет эту надпись и получит имя эксперта или магик.

 

Если советник на символе один, и есть уже открытые или закрытые им ордера, то достаточно проверить их магики

 
А непроще в советнике, в функции init() задать GlobalVariableSet = MAGIC. И потом скритом этот GV читать?
 
goldtrader писал(а) >> Виктор, не это WindowExpertName( ) случаем?

Гы.., я с этого начал и был очень разочарован. Функция из новых, а возможности ее невелики.

kombat _писал(а) >>

Так и делаю, но ищу, как попроще передать в скрипт магик советника.

Integer _писал(а) >> ..Пусть эксперт создает надпись (LABEL)..

Вариант.

xrust_ писал(а) >> Если советник на символе один, и есть уже открытые или закрытые им ордера, то достаточно проверить их магики

Вариант. Но не соображу, нужен ли будет на символе еще советник. Пока не нужен. а там, кто его знает..

И еще, вдруг потребуется войти, когда нет открытых позиций, например, советник пропустил сделку?

vasilyt _писал(а) >> А непроще в советнике, в функции init() задать GlobalVariableSet = MAGIC. И потом скритом этот GV читать?

Ох, чую я, что этим все закончится... Хотелось красиво м универсально, а получится как всегда - коряво, но работает.


Большое спасибо всем за дельные советы!

 
vasilyt писал(а) >>
А непроще в советнике, в функции init() задать GlobalVariableSet = MAGIC. И потом скритом этот GV читать?

Можно и так. Но с надписью наглядней - видно, что эксперт поддерживает совместную работу со скриптом для доливки, всего-т не упомнишь, создает какой-то советник глобальную переменную с магиком или нет.

 
granit77 >>:

Для выставления вручную дополнительных ордеров хотелось бы... 


Если это конечно не секрет, и Вас не напряжЁт разрешите попросить озвучить стратегию доливок?
 
Integer >>:

...с надписью наглядней - видно, что эксперт поддерживает совместную работу со скриптом для доливки, всего-т не упомнишь, создает какой-то советник глобальную переменную с магиком или нет.

Убедил. Пробовал по всякому, но с графическим объектом нагляднее и безопасней. Кроме уже отмеченного, объект доступен только с конкретного графика, на котором стоит эксперт.

В советник вставляется несколько строк для создания объекта.

  string _comment;
  string LabelPrefix ="ExpertLabel";//префикс имени графического объекта
  init()
  {
  _comment=WindowExpertName();
  ExpertLabel(LabelPrefix+_comment,DoubleToStr(Magic,0),"Tahoma", 14, Red,1000,30);
  return(0);
  }
  deinit()
  {
  int obj_total=ObjectsTotal();
  for(int i=obj_total+1;i>-1;i--){
      string name=ObjectName(i);
      if(StringFind( name,LabelPrefix,0)>-1) ObjectDelete(name);
  }   
  return(0);
  }

  int start()
  {
   .........
  }

//+----------------------------------------------------------------------------------------+
//| Void ExpertLabel вызов :ExpertLabel("Expert_21","Моя метка","Tahoma", 14, Gold,50,50); |
//+----------------------------------------------------------------------------------------+
void ExpertLabel(string LabelName, string LabelText,string Font, int FontSize, color FontColor,int Xdist, int Ydist)
{
   int err;
   int    obj_total=ObjectsTotal();
   string name;
   for(int i=obj_total+1;i>-1;i--){
      name=ObjectName(i);
      if(StringFind( name,LabelPrefix,0)>-1) ObjectDelete(name);
   }   
   if(!ObjectCreate(LabelName,OBJ_LABEL,0,0,0,0,0))
    {
      err=GetLastError();
      Print("error: can't create Label! code #",err);
      return;
    }
   else
   {
     ObjectSet(LabelName,OBJPROP_XDISTANCE,Xdist);
     ObjectSet(LabelName,OBJPROP_YDISTANCE,Ydist);
     ObjectSetText(LabelName,LabelText,FontSize,Font,FontColor);    
     WindowRedraw();
   }
}   

Сам скрипт сделан из скрипта Itso VisualOpenOrderWithMM. Удобная штука, я ей пользовался.

Код в прицепе. Все желающие могут безнаказанно попинать как код, так и автора. :))



Файлы:
Причина обращения: