Решаема ли задача в принципе на MQL4 ? - страница 2

 

Давайте код, к вечеру разберемся.

Можно в личку :)

 
tara:
Давайте код, к вечеру разберемся.

#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

//#include <WinUser32.mqh>
//int whwnd;
//#include <stdlib.mqh> // Стандартная библиотека
double b;
double percent;
double maxpercent = 0;
int Timetoresume = 10;
int selecttime = 1;
string status,status1;
int total;
int magic[100];
int kol=0;
int tempkol =0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{

return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
// while(!IsStopped()) // До тех пор, пока пользователь..
/// { // ..не прекратит исполнение программы
// RefreshRates();
b = AccountBalance()/100;
percent = AccountProfit()/b;
if (maxpercent > percent) maxpercent = percent;
Timetoresume = TimeLocal();
if (percent*(-1) > 1) status = "Freeze Active";
else status = "Running";
total=OrdersTotal();
kol =0;
for (int i=total; i>0; i--) { // присваивает каждому элементу массива значение маджика каждого открытого ордера
OrderSelect (i-1,SELECT_BY_POS,MODE_TRADES);
magic[i] = OrderMagicNumber ();
// Print ("Magic " + i+" " +magic[i]);
}
for (int k = 1; k <= 1; k++){ // сравнивает маджик первого открытого ордера с последующими
tempkol = magic[k];
for ( int l = 1; l <=total;l++){
if (tempkol != magic[l]) kol++;
}
}
if(kol >= 2){ // если более 2 советников уже вступили в сделки
GlobalVariableSet ("Freeze1",200) ; // остальные советники должны слушаться этих глобальных переменных
GlobalVariableSet ("Freeze2",200); // и в сделки не вступать, а они успевают понаоткрывать ордера пока этот
status1="test2"; //советник GlobalVariableSet ("Freeze1",200) делает, дождавшись своей
} // очереди в терминале
Comment ( AccountProfit()
,"\n"
,"DrawDown ",NormalizeDouble (percent,1)*(-1), " %", " MaxDrawDown ", NormalizeDouble (maxpercent,1)*(-1), " % "
, Timetoresume
,"\n"
,status," ",percent*(-1)
,"\n"
,"Order Total ",total
,"\n"
,OrderSymbol()," Magic ", OrderMagicNumber()," ",kol
,"\n"," ",status1
);
return;
}

//+------------------------------------------------------------------+

НЕ судите строго, в последний раз порграммы писал еще на Синклере, на бейсике в школьные годы ....


 
Zakyza:


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


Конечно можно.

Организуйте работу советников по схеме "master-slave"

 
avtomat:


Конечно можно.

Организуйте работу советников по схеме "master-slave"


Пожалуйста поподробнее как это организовать, на торгующие советники можно воздействовать только посредством изменения значения глобальной переменной и они эту переменную GlobalVariableSet ("Freeze1",200) слушаются когда мой " управляющий" соизволит, дождавшись своей очереди, записать туда 200
 
Zakyza:

Пожалуйста поподробнее как это организовать, на торгующие советники можно воздействовать только посредством изменения значения глобальной переменной и они эту переменную GlobalVariableSet ("Freeze1",200) слушаются когда мой " управляющий" соизволит, дождавшись своей очереди, записать туда 200

Почему ваш управляющий, если он - управляющий, дожидается какой-то очереди?

Это ведомые должны ожидать своей: управляющий вписал в GV запрет на торговлю - сидят, молчат (ведомый первым тиком проверил глобальный флаг, если "сидеть не бздеть" - сказал ЯвольГерГенераль, и return(0))...

Почему у вас управляющий ждёт свою очередь на доступ к GV флагу?

 
Это все делается одним советником ))) Хоть 100 пар в него запихай )))
 
artikul:
Это все делается одним советником ))) Хоть 100 пар в него запихай )))

ну не об этом же речь...
 

master

//+------------------------------------------------------------------+
int deinit()
  {
      GlobalVariableSet(work,0);   // запрещение работы ведомым
   return(0);
  }
//+------------------------------------------------------------------+
.....

int start()
   .....

   work=GlobalVariableGet(work);

   if( work==0 && всё_хорошо )   GlobalVariableSet(work,1);   // разрешение работы ведомым

   if( work==1 && всё_плохо )    GlobalVariableSet(work,0);   // запрещение работы ведомым

// можно организовать систему запретов/разрешений любой сложности   

   .....

slave

.....

int start()


   work=GlobalVariableGet(work);

   if( work==0 )   { стоп } ;    // здесь возможны некоторые действия для завершения текущих процессов

   if( work==1 )   { работа };   // ведомым разрешена работа -- можно работать в нормальном режиме

.....

Надеюсь, ясно изложил.

 
avtomat:

master

slave

Надеюсь, ясно изложил.


Все ясно, спасибо.

Я так пробовал делать (т.е. сходу запрещать, а разрешать по ситуации), но у меня это работает следующим образом:

после такой инициализации мастера: int deinit().... // запрещение работы ведомым ведомые молчат послушно, НО стоит только мастеру расслабиться ( if (количество одинаковых маджиков <=2) ) и записать в GlobalVariableSet(work,1); // разрешение работы ведомым ведомые, а их 8 на 8 различных парах, успевают открываться не по 2 парам как задано в условии мастера, а по 4 - 6, т.е открываются ПОКА мастер не "сообразит" что "количество одинаковых маджиков " уже значительно больше 2. После этого конечно остальные ведомые молчат, но открыто то уже не 2 копии как хотелось, а 4- 6.

Я так понимаю происходит это из-за того что выполнив мой код int start() управление передается int start() ведомым советникам и от того сколько успеет выполниться int start() ведомых советников и зависит сколько копий по скольким парам откроется пока не выполнится старт мастера и глобальная не станет запрещающей. Поправите если я неверно понимаю алгоритм работы терминала и суть проблемы. Грубо говоря так: если один мастер и один ведомый то все скорее всего заработает правильно, но ведомых то 8-10 !

Я почему и писал, что пробовал зациклить старт мастера и обречь его на вечное выполнение, но у меня просто подвис терминал.

artmedia70 : " Почему ваш управляющий, если он - управляющий, дожидается какой-то очереди? " - вот и я хотел бы знать.

 

А почему и зачем делаются два одинаковых магика?

Через глобальные переменные можно организовать назначение непересекающихся областей магиков для включаемых советников. В init() делаются соответствующие проверки и назначения.

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

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