Помогите, пожалуйста, как использовать функции от КimIV!

 

Здрасьте! Извините, нашёл функции, но не нашёл или не понял, как вставить в советник для того, чтобы, если советник не закрывает профитную позицию, а нужно закрыть её по достижении установленного мной процента от баланса по формуле, приведённой ниже:

extern double Percent = 10;
//----

double pr = AccountBalance()*Percent/100;
//----

ClosePosBySizeProfitInCurrency();//функции
ClosePosBySelect();              //от КimIV

А то бывает обидно, когда цена не достигает запрограмированных параметров. Спасибо всем, кто поможет!

 
borilunad:

Здрасьте! Извините, нашёл функции, но не нашёл или не понял, как вставить в советник для того, чтобы, если советник не закрывает профитную позицию, а нужно закрыть её по достижении установленного мной процента от баланса по формуле, приведённой ниже:

А то бывает обидно, когда цена не достигает запрограмированных параметров. Спасибо всем, кто поможет!


Попробуйте так:

extern double Percent = 10.0;
//----
int start()
{

if(AccountProfit()>AccountBalance()*Percent/100.0)CloseAllPos();
//..... здесь прочие Ваши действия
//.....
return(0);
}//конец функции старт


//-- функция закрытия всех позиций, но сначала с большим лотом..... Разместить эту функцию за пределами функции старт.
void CloseAllPos(){
   double maxlot=0;
   for(int i=OrdersTotal()-1; i>=0; i--){
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       if(OrderSymbol()==Symbol()){
         if(OrderMagicNumber()==Magic){ 
           if(maxlot<OrderLots()){ 
             maxlot=OrderLots();
             if(OrderType()==OP_BUY)OrderClose(OrderTicket(),maxlot,NormalizeDouble(Bid, Digits),slip,Yellow);
             if(OrderType()==OP_SELL)OrderClose(OrderTicket(),maxlot,NormalizeDouble(Ask, Digits),slip,Yellow);
  } } } } } }
 
borilunad:

А то бывает обидно, когда цена не достигает запрограмированных параметров. Спасибо всем, кто поможет!

Согласен. Обидно.

Но здесь даже Игорь не поможет ( в смысле, что бы цена достигла....)

................

А по вопросу:

extern double Percent = 10;
double pr; 
 //----

void start()
{
pr = AccountBalance()*Percent/100;
ClosePosBySizeProfitInCurrency();
...........
............
}
 
DhP:


Попробуйте так:


Спасибо за отклик и совет! Только необходимо закрыть только одну из позиций, а не все. Тогда как?
 
lasso:

Согласен. Обидно.

Но здесь даже Игорь не поможет ( в смысле, что бы цена достигла....)

................

А по вопросу:


Спасибо и Вам! Попробую, может получится...
 
borilunad:

Спасибо за отклик и совет! Только необходимо закрыть только одну из позиций, а не все. Тогда как?

Попробуйте эту функцию:
void CLOSE() { 
    int gle=GetLastError();
    int NumberOfTry=3;//количество попыток закрыть. 


    for (int cnt=OrdersTotal()-1; cnt>=0; cnt--){
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)){
        if(OrderSymbol()==Symbol()){ 
          if(OrderMagicNumber()==Magic){
            for (int i=1; i<=NumberOfTry; i++) {
              if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
              while (!IsTradeAllowed()) Sleep(5000);
              RefreshRates();
              if(OrderType()==OP_BUY){ 
                OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid, Digits),slip,White);  
                if(gle!=0){
                  Print ("BUY CLOSE ERROR:",gle);} 
               } 
              if(OrderType()==OP_SELL){  
                OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask, Digits),slip,White);  
                if(gle!=0){
                  Print ("SELL CLOSE ERROR:",gle);} 
  } } } } } } } 
 
borilunad:

Спасибо за отклик и совет! Только необходимо закрыть только одну из позиций, а не все. Тогда как?

В описании к ф-ции

ClosePosBySizeProfitInCurrency()

говорится:

Закрытие тех позиций, у которых профит в валюте депозита превысил некоторое значение.

т.е. сколько будет таких позиций, столько и закроет.

 
lasso:

В описании к ф-ции

говорится:

Закрытие тех позиций, у которых профит в валюте депозита превысил некоторое значение.

т.е. сколько будет таких позиций, столько и закроет.


К сожалению, с функцией от Кима не выходит. Требуется всё больше и больше данных, а без них выходят ошибки и предупреждения. Что называется, чем дальше в лес, тем больше дров. Мои недостатки в знании программировании не позволяют добиться желаемого.

Извините за беспокойство и благодарю Вас за внимание!

 
DhP:

Попробуйте эту функцию:


Попробовал, скомпилировал. Тестирование по процентам показало, что когда закрывает, закрывает все позиции разом, а не по одной, исходя из заданного процента к балансу. И баланс учитывается первоначальный, а не на момент закрытия. Не знаю, что делать. Что только ни перепробовал! Вызов функции поставил перед тралением. Привожу эту часть кода:

  if((OrderType() == OP_BUY || OrderType() == OP_SELL) 
  && AccountProfit()>=AccountBalance()*Percent/100.0) CLOSE();

Может в функции надо что-то поправить? Надеюсь сейчас только на Вас, Ув. DhP! Спасибо!

 
borilunad:


Попробовал, скомпилировал. Тестирование по процентам показало, что когда закрывает, закрывает все позиции разом, а не по одной, исходя из заданного процента к балансу. И баланс учитывается первоначальный, а не на момент закрытия. Не знаю, что делать. Что только ни перепробовал! Вызов функции поставил перед тралением. Привожу эту часть кода:

Может в функции надо что-то поправить? Надеюсь сейчас только на Вас, Ув. DhP! Спасибо!


Закрыть одну конкретную позицию, достигшую заданную процентом от баланса прибыль, можно, но надо ли Вам это сейчас?

Проще эта задача решается применением ТейкПрофита, и именно так (или почти так) все и поступают.

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

 
DhP:


Закрыть одну конкретную позицию, достигшую заданную процентом от баланса прибыль, можно, но надо ли Вам это сейчас?

Проще эта задача решается применением ТейкПрофита, и именно так (или почти так) все и поступают.

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


Большое спасибо за доброе пожелание!

Позвольте объяснить, почему нужно закрыть именно одну позу с наибольшим профитом и не с ТейкПрофитом! Не Вам мне объяснять, что трал более гибок, чем ТП. И нужно закрыть только одну позу, чтобы не нарушать стратегию советника закрывать по тралу и, если сформируется обратный тренд, снова войти в рынок. Может, указать в условии, что нужно закрыть только одну максимальную позицию... Но пока не нашёл, как сравнивать текущий Профит каждой позиции, чтобы выбрать наибольшую, достигшую определённый тестированием процент от текущего на этот момент баланса. Даже закрывая все позиции разом тест показывант лучше результат на истории.

К сожалению, не имею опыта в базовых языках, баловался только дизайном в Директоре на Линго. МQL более строгий, не терпит фривольности. Может, всё-таки есть возможность сравнивать Профиты позиций или нет. Пока находил общий Профит одной пары или портфельный. Но я пока сконцентрируюсь на одной EURUSD.

Большое спасибо за помощь и надеюсь на подсказку, как "Закрыть одну конкретную позицию, достигшую заданную процентом от баланса прибыль". Если "можно", почему бы не "сейчас"? Всего Вам доброго!

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