Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
На MQL5.community есть возможность хранить исходные коды в MQL5 Storage. Попробуй сам!
Boris
3901
Boris 2011.06.16 15:11 

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

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

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

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

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

BBC
1627
BBC 2011.06.16 15:35  
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);
  } } } } } }
Vitaliy
1136
Vitaliy 2011.06.16 15:40  
borilunad:

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

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

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

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

А по вопросу:

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

void start()
{
pr = AccountBalance()*Percent/100;
ClosePosBySizeProfitInCurrency();
...........
............
}
Boris
3901
Boris 2011.06.16 15:47  
DhP:


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


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

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

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

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

А по вопросу:


Спасибо и Вам! Попробую, может получится...
BBC
1627
BBC 2011.06.16 15:57  
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);} 
  } } } } } } } 
Vitaliy
1136
Vitaliy 2011.06.16 16:06  
borilunad:

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

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

ClosePosBySizeProfitInCurrency()

говорится:

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

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

Boris
3901
Boris 2011.06.16 19:47  
lasso:

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

говорится:

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

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


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

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

Boris
3901
Boris 2011.06.16 20:26  
DhP:

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


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

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

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

BBC
1627
BBC 2011.06.16 21:07  
borilunad:


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

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


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

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

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

Boris
3901
Boris 2011.06.16 22:18  
DhP:


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

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

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


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

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

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

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

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий