расчет Мин/Мах цены от цены открытия до наст.момента (по времени, а не по барам) - страница 3

 
string Prefix;

Открытие ордера:

int rv=OrderSend(...);

   if(rv>0){

      GlobalVariableSet(Prefix+rv+"_Max",Bid);

      GlobalVariableSet(Prefix+rv+"_Min",Bid);

   }

Далее в прцессе работы:

for(i=0;i<OrdersTotal();i++){

     if(OrderSelect(...)){

          if(наш ордер){


               
               rv=OrderTicket();

            if(!GlobalVariableCheck(Prefix+rv+"_Max"))GlobalVariableSet(Prefix+rv+"_Max",Bid);

            if(!GlobalVariableCheck(Prefix+rv+"_Min"))GlobalVariableSet(Prefix+rv+"_Min",Bid);

            GloabalVariableSet(Prefix+rv+"_Max",MathMax(Bid,GlobalVariableGet(Prefix+rv+"_Max")));

            GloabalVariableSet(Prefix+rv+"_Min",MathMin(Bid,GlobalVariableGet(Prefix+rv+"_Min")));

         }

     }

}

Насчет переменной Prefix. Чтобы у всех советников свой префикс был, и не путался с тестером, и чтобы тестировать можно было (здесь имя переменной gvp):

в ините:

   gvp=WindowExpertName()+"_"+Symbol()+"_"+Magic_N+"_";
   if(IsTesting())gvp=gvp+"t_";
   if(IsDemo())gvp=gvp+"d_";
   
      if(IsTesting()){
         for(int i=GlobalVariablesTotal()-1;i>=0;i--){
            if(StringFind(GlobalVariableName(i),gvp,0)==0){
               GlobalVariableDel(GlobalVariableName(i));
            }
         }
      }

В деините:

      if(IsTesting()){
         for(int i=GlobalVariablesTotal()-1;i>=0;i--){
            if(StringFind(GlobalVariableName(i),gvp,0)==0){
               GlobalVariableDel(GlobalVariableName(i));
            }
         }
      }
 

А какой смысл фиксить маскимум и миниму цены, если он выполняется только пока советник работает, с таким же успехом буде работать обыкновенный трейлинг. Суть задачи в том, чтобы знать исторический пик прибыли ордера. Один вариант - по минуткам.

 
Integer писал(а) >>

А какой смысл фиксить маскимум и миниму цены, если он выполняется только пока советник работает, с таким же успехом буде работать обыкновенный трейлинг. Суть задачи в том, чтобы знать исторический пик прибыли ордера. Один вариант - по минуткам.

Огромное спасибо за Код- сидю, разбираюсь...... :-) После слива первого депо, понял, что программировать нужно самому, чтобы до конца знать возможности советника..... так, что я сейчас в поисках, ну хоть какой нибудь стратегии приносящей стабильную, пусть и небольшую прибыль При тестировании МТС на таймфреймах свыше 15-30 минут параметры начала трейлинга достаточно большие, свыше 10-15 пипсов, вот и возникла идея, чтобы ловить поменьше стопов (даже в ущерб основной прибыли) попробовать отловить и эту прибыль, а потом повторно открыться поновой если условие выставления сохраниться..... то есть в зоне запрета модификации ордеров, а можно только удалить и поставить по новой. Это чем то сродни пипсовке.... да и мне просто интересно, как мои идеи по построению алгоритма в этой задаче соответствуют "правильному" классическому решению.......

Всем больших профитов и удачи!

 

Integer, спасибо за код и за сэкономленное время: код и мне пригодится тоже. С вариантом if(StringFind(GlobalVariableName(i),gvp,0)==0) еще не встречался. Вопрос: в каком случае в деините if(StringFind(GlobalVariableName(i),gvp,0)!=0) ?

 
coaster писал(а) >>

Integer, спасибо за код и за сэкономленное время: код и мне пригодится тоже. С вариантом if(StringFind(GlobalVariableName(i),gvp,0)==0) еще не встречался. Вопрос: в каком случае в деините if(StringFind(GlobalVariableName(i),gvp,0)!=0) ?

Выбираем глобальные переменные с именем начинающимся на gvp. Если позиция подстроки gvp в строке GlobalVariableName() равна 0, значит имя переменной начинается с gvp - значит наша переменая, удаляем ее. Удаление выполняется только при тестировании.

 
Integer >>:

Выбираем глобальные переменные с именем начинающимся на gvp. Если позиция подстроки gvp в строке GlobalVariableName() равна 0, значит имя переменной начинается с gvp - значит наша переменая, удаляем ее. Удаление выполняется только при тестировании.

Понятно, а когда в isTesting() происходит инит и деинит? (вопрос из-за вопроса о необходимости предварительного освобождения памяти в ините)

И всё. Больше нет вопросов. :)

 
coaster писал(а) >>

Понятно, а когда в isTesting() происходит инит и деинит? (вопрос из-за вопроса о необходимости предварительного освобождения памяти в ините)

И всё. Больше нет вопросов. :)

В isTesting() - никогда не происходит ни инит ни деинит. В mql4 нет никаких функций по работе с памятью.

 

Тогда зачем (?) в ините и деините такое условие: if(IsTesting()){

если в режиме тестирования (имелось ввиду не в функции isTesting(), а в режиме isTesting()==true) не происходит ни инита ни деинита.

 
coaster писал(а) >>

Тогда зачем (?) в ините и деините такое условие: if(IsTesting()){

если в режиме тестирования (имелось ввиду не в функции isTesting(), а в режиме isTesting()==true) не происходит ни инита ни деинита.

Затем, чтобы работая на счете, при запуске и отключении эксперта, глабальные переменные сохранялись, а при тестировании удалялись, чтобы переменные оставшиеся от предудущего прогона в тестере не влияли на результаты следующего прогона. В тестере свой префикс у переменных - if(IsTesting())gvp=gvp+"t_";

 

Кажись расходимся в понимании. ))) Повторюсь:

..., а когда в isTesting()(т.е. в режиме тестирования) происходит инит и деинит? (вопрос из-за вопроса о необходимости предварительного освобождения памяти(т.е. удаления глоб.переменных) в ините)