Скачать MetaTrader 5

сравнение балансов

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

Здравствуйте, уважаемые форумчане!

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

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

Извиняйте, если колхоз получился далее. Но нижеследующее не работает.

bool TradeProfit()

{

double AccBalance=50000;

bool balance=false;


if(CalculateCurrentOrders(Symbol())==0)

{

if (AccBalance<=AccountBalance()) balance=true;

if (AccBalance<AccountBalance()) balance=false;

}

return(balance);

}

Jequile
84
Jequile  

забыл еще присвоение перед return

AccBalance=AccountBalance() .

что в этой идее не верно

Ahmad Mehdiyev
481
Ahmad Mehdiyev  
Если последние два ордера (точнее сказать 2 позиции) закрыты, почему бы вам не сделать перебор OrdersHistoryTotal и смотреть на результат этих двух ордеров. Так я думаю будет легче.
Jequile
84
Jequile  

Спасибо за ответ.

Что-то вроде этого ?

int OrdersProfit()

{

int orders=OrdersHistoryTotal();

double LastOrder=0;

double PrelastOrder=0;

int TradeUP=0;

for (i=0;i<orders;i++)

{

OrderSelect(orders-1,SELECT_BY_POS,MODE_HISTORY);

LastOrder=OrderProfit();

OrderSelect(orders-2,SELECT_BY_POS,MODE_HISTORY);

PrelastOrder=OrderProfit();

if ((LastOrder+PrelastOrder)>=0) TradeUP=0;

else TradeUP++;

}

return(TradeUP);

}


Vladimir Gomonov
8330
Vladimir Gomonov  
Jequile:

забыл еще присвоение перед return

AccBalance=AccountBalance() .

что в этой идее не верно


У вас там опечатка, потому и косячит:

 if(CalculateCurrentOrders(Symbol())==0)
  {
   if (AccBalance<=AccountBalance()) balance=true;
   if (AccBalance < AccountBalance()) balance=false;  // здесь косяк
  }

Поменяйте знак "<" на ">" и идея заработает.

Но возможны и другие подходы, например смотреть прибыль на последних ордерах. Как лучше делать Вам решать.

Ahmad Mehdiyev
481
Ahmad Mehdiyev  
Jequile:

Спасибо за ответ.

Что-то вроде этого ?

int OrdersProfit()

{

int orders=OrdersHistoryTotal();

double LastOrder=0;

double PrelastOrder=0;

int TradeUP=0;

for (i=0;i<orders;i++)

{

OrderSelect(orders-1,SELECT_BY_POS,MODE_HISTORY);

LastOrder=OrderProfit();

OrderSelect(orders-2,SELECT_BY_POS,MODE_HISTORY);

PrelastOrder=OrderProfit();

if ((LastOrder+PrelastOrder)>=0) TradeUP=0;

else TradeUP++;

}

return(TradeUP);

}



Ну в принципе думаю работать будет, НО... мне кажется вам нужна проверка на Symbol, на OrderType (отмененный отложенник может все спутать), на MagicNumber воспользуйтесь тем что другие уже сделали и отладили https://www.mql5.com/ru/forum/131859/page4#434231 на этой странице есть функция Кима isLossLastPos.
Jequile
84
Jequile  

Да наверно просто вставил косо или когда правил код при написании сообщения опечатку допустил. В любом случае OrderSend error 4051; invalid lots amount for OrderSend function.

там далее просто эту функция используется для изменения лота (типа мартина) так что хз. С ордерами нужно попробовать по отдельности, хотя код из сообщения 3 моего тоже не работал. Я пробовал уже)

Jequile
84
Jequile  
предыдущий пост относится к сообщению MetaDriver'a.
Jequile
84
Jequile  
Хорошо спасибо pro.
Mikhail Kozhemyako
1287
Mikhail Kozhemyako  

Вот так лучше будет

#define MAGIC 12345678
int start(){
 int N=2;
 Print("Профит последних ",N," ордеров=",NOrdersProfit(N));
}
double NOrdersProfit(int n=999999999){ // Возвращает суммарный профит n последних закрытых ордеров.
 int orders=OrdersHistoryTotal();
 int LastClosedCounted=0;
 double LastNOrdersProfit=0;
 for (int i=orders-1;i>=0;i--) {
  if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
   if(OrderMagicNumber()==MAGIC) {
    if(LastClosedCounted >= n) break;
    else {LastNOrdersProfit=+OrderProfit();LastClosedCounted++;}
   }
  }
 }
 if(LastClosedCounted<n) Print("В истории всего лишь ",LastClosedCounted," Ордеров c магиком ",MAGIC);
 return(LastNOrdersProfit);
}
Ahmad Mehdiyev
481
Ahmad Mehdiyev  

Так действительно будет лучше. Четко и красиво. Только вот это верно или опечатка?

else {LastNOrdersProfit=+OrderProfit();LastClosedCounted++;}


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