Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1943
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Пусть это будет все рамках одной валютной пары, EurUsd например. Оба открыты в Buy.
вообще это разные задачи, на разных парах и на одной. На одной, с одинаковым лотом 2 ордера/позиции имеют варианты разнонаправленные не пересекающиеся, и пересекающиеся. цена между не пересеающимися убыток у обоих, у пересекающихся прибыль только между ордерами. Выше ниже либо убыток либо профит в зависимости от расстояния до ордеров. Для одного направления между, один в прибыль другой в убыток, выше ниже оба в прибыли или в убытке.
По вашей хотелке. Если одинаковый обьем, то закрываете такой же обьем, если не одинаковый, то надо посчитать количество денег в прибыли, количество убытка в деньгах, вычислить соотношение прибыли к убытку, умножить это соотношение на количество лотов убыточной позиции и эту часть закрыть.
Подскажите, пожалуйста, как заставить программу работать только тогда, когда началась новая свеча и после прогона по коду затаиться и ждать начало следующей свечи?
фунция
вообще это разные задачи, на разных парах и на одной. На одной, с одинаковым лотом 2 ордера/позиции имеют варианты разнонаправленные не пересекающиеся, и пересекающиеся. цена между не пересеающимися убыток у обоих, у пересекающихся прибыль только между ордерами. Выше ниже либо убыток либо профит в зависимости от расстояния до ордеров. Для одного направления между, один в прибыль другой в убыток, выше ниже оба в прибыли или в убытке.
По вашей хотелке. Если одинаковый обьем, то закрываете такой же обьем, если не одинаковый, то надо посчитать количество денег в прибыли, количество убытка в деньгах, вычислить соотношение прибыли к убытку, умножить это соотношение на количество лотов убыточной позиции и эту часть закрыть.
Все верно) Именного этого я и хочу. Вычислить и закрыть убыточную часть.
Есть примеры?
Пробовал через while, запутался, не получилось.
фунция
Все верно) Именного этого я и хочу. Вычислить и закрыть убыточную часть.
Есть примеры?
Пробовал через while, запутался, не получилось.
возьми за образец, если я не ошибаюсь эти функции перекрывали одно направление, то есть или только баи или селлы. Короче допиливать надо.
//=========================================================================================================================================// // Функция расчета текущего состояния по открытым ордерам // //=========================================================================================================================================// //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double CurrentCondition(string OrdType, string inf) { int Pos = 0; double result = 0, Count = 0, AveragePrice = 0, profit = 0; double LastPriceBuy, LastPriceSell, ProfitBuy, ProfitSell, SumProfit; for(int cnt = 0; cnt < OrdersTotal(); cnt++) { if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck())) { if(OrderType() == OP_SELL || OrderType() == OP_BUY) { if(inf == "Lpos") { profit = OrderProfit() ; Pos = OrderTicket() ; if(profit > 0 && profit > Lprofit) { Lprofit1 = Lprofit ; Lpos1 = Lpos ; Lprofit = profit ; //макс значение Lpos = Pos ; } if(profit < 0 && profit < Cprofit) { Cprofit = profit ; //мин значение Cpos = Pos ; } } SumProfit += OrderProfit() + OrderSwap() + OrderCommission() ; if(inf == "CurrentDrawdown") result = MathMax((AccountBalance() + AccountCredit() - AccountEquity()) / (AccountBalance() + AccountCredit()) * 100, 0); if(inf == "CurrentUrov" && AccountMargin() > 0) result = AccountEquity() / AccountMargin() * 100 ; if(inf == "TotalOrd") result++ ; if(OrdType == "Buy") { if(OrderType() == OP_BUY) { if(inf == "TotalBuy") result++ ; if(inf == "LastLotBuy") result = OrderLots() ; if(inf == "SumLotBuy") result += OrderLots() ; AveragePrice += OrderOpenPrice() * OrderLots() ; Count += OrderLots() ; LastPriceBuy = OrderOpenPrice() ; ProfitBuy += OrderProfit() + OrderSwap() + OrderCommission() ; if(AveragePrice > 0 && Count > 0) { if(inf == "CalculateAveragePriceBuy") return(NormalizeDouble(AveragePrice / Count, Digits)); } else return(0); } } if(OrdType == "Sell") { if(OrderType() == OP_SELL) { if(inf == "TotalSell") result++ ; if(inf == "LastLotSell") result = OrderLots() ; if(inf == "SumLotSell") result += OrderLots() ; AveragePrice += OrderOpenPrice() * OrderLots() ; Count += OrderLots() ; LastPriceSell = OrderOpenPrice() ; ProfitSell += OrderProfit() + OrderSwap() + OrderCommission(); if(AveragePrice > 0 && Count > 0) { if(inf == "CalculateAveragePriceSell") return(NormalizeDouble(AveragePrice / Count, Digits)); } else return(0); } } } } } } if(inf == "Lpos") return(Lpos) ; //Ордер с наибольшим профитом if(inf == "Cpos") return(Cpos) ; //Ордер с наименьшим профитом if(inf == "LastPriceBuy") return(NormalizeDouble(LastPriceBuy, Digits)) ; if(inf == "LastPriceSell") return(NormalizeDouble(LastPriceSell, Digits)) ; if(inf == "ProfitBuy") return(NormalizeDouble(ProfitBuy, 2)) ; if(inf == "ProfitSell") return(NormalizeDouble(ProfitSell, 2)) ; if(inf == "SumProfit") return(NormalizeDouble(SumProfit, 2)) ; return(result) ; } //=========================================================================================================================================// // Перекрытие ордеров // //=========================================================================================================================================// //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CheckOverlapping() { Lpos = 0; Cpos = 0; Lprofit = 0; Cprofit = 0; Lpos = CurrentCondition("", "Lpos"); Cpos = CurrentCondition("", "Cpos"); if(totalord >= LeadingOrder) { if(Lprofit > 0 && Lprofit1 <= 0 && Cprofit < 0) { if(Lprofit + Cprofit > 0 && (Lprofit + Cprofit) * 100 / Lprofit > ProfitPersent) { Lpos1 = 0; CloseSelectOrder(); } } else if(Lprofit > 0 && Lprofit1 > 0 && totalord > LeadingOrder && Cprofit < 0) { if(Lprofit + Lprofit1 + Cprofit > 0 && (Lprofit + Lprofit1 + Cprofit) * 100 / (Lprofit + Lprofit1) > SecondProfitPersent) CloseSelectOrder(); } } } //=========================================================================================================================================// // Перекрытие ордеров // //=========================================================================================================================================// //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CloseSelectOrder() { if(Info) Print("Функция перекрытия ордеров."); int error = 0; int error1 = 0; int error2 = 0; int Result = 0; int Slippage = 2 * MarketInfo(Symbol(), MODE_SPREAD); // ---------------------- последний ----------------------- while(error1 == 0) { RefreshRates(); int i = OrderSelect(Lpos, SELECT_BY_TICKET, MODE_TRADES); if(i != 1) { Print("Ошибка! Невозможно выбрать ордер с наибольшим профитом. Выполнение перекрытия отменено."); return (0); } if(OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck())) { if(OrderType() == OP_BUY) { error1 = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Slippage, Blue)); if(error1 == 1) { if(Info) Print("Лидирующий ордер закрыт успешно."); Sleep(500); } else { Print("Ошибка закрытия лидирующего ордера, повторяем операцию. "); } } // ----------------------------------------------------- if(OrderType() == OP_SELL) { error1 = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Slippage, Red)); if(error1 == 1) { if(Info) Print("Лидирующий ордер закрыт успешно"); Sleep(500); } else { Print("Ошибка закрытия лидирующего ордера, повторяем операцию. "); } } } } // ---------------------- пред последний ----------------------- if(Lpos1 != 0) { while(error2 == 0) { RefreshRates(); i = OrderSelect(Lpos1, SELECT_BY_TICKET, MODE_TRADES); if(i != 1) { Print("Ошибка! Невозможно выбрать пред ордер с наибольшим профитом. Выполнение перекрытия отменено."); return (0); } if(OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck())) { if(OrderType() == OP_BUY) { error2 = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Slippage, Blue)); if(error2 == 1) { if(Info) Print("Пред Лидирующий ордер закрыт успешно."); Sleep(500); } else { Print("Ошибка закрытия пред лидирующего ордера, повторяем операцию. "); } } // ----------------------------------------------------- if(OrderType() == OP_SELL) { error2 = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Slippage, Red)); if(error2 == 1) { if(Info) Print("Пред Лидирующий ордер закрыт успешно"); Sleep(500); } else { Print("Ошибка закрытия Пред лидирующего ордера, повторяем операцию. "); } } } } } // ----------- выбранный (обычно с наименьшим профитом ) ----------- while(error == 0) { RefreshRates(); i = OrderSelect(Cpos, SELECT_BY_TICKET, MODE_TRADES); if(i != 1) { Print("Ошибка! Невозможно выбрать ордер с наименьшим профитом. Выполнение перекрытия отменено."); return (0); } if(OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck())) { if(OrderType() == OP_BUY) { error = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Slippage, Blue)); if(error == 1) { if(Info) Print("Перекрываемый ордер закрыт успешно."); Sleep(500); } else { Print("Ошибка закрытия перекрываемого ордера, повторяем операцию. "); } } // -------------------------------------------------- if(OrderType() == OP_SELL) { error = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Slippage, Red)); if(error == 1) { if(Info) Print("Перекрываемый ордер закрыт успешно."); Sleep(500); } else { Print("Ошибка закрытия перекрываемого ордера, повторяем операцию. "); } } } } Result = 1; return (Result); }Все верно) Именного этого я и хочу. Вычислить и закрыть убыточную часть.
Есть примеры?
Пробовал через while, запутался, не получилось.
а зачем вайл понимаете? что не получается то? Код нужен. У меня просто таких задач не было. и честно считаю такой подход не разумным к мани менеджменту.
Подскажите, как в мт5 сделать так чтобы в одно окно загружались 2 одинаковых индикатора с одинаковыми инпутами? Пробовал INDICATOR_SHORTNAME менять при каждом запуске, что то не помогает. Может еще есть способы?
Заведите ещё один никчёмный input и его меняйте.
а зачем вайл понимаете? что не получается то? Код нужен. У меня просто таких задач не было. и честно считаю такой подход не разумным к мани менедДумаю
добрый день. Про вайл читал. Не получатся сложить или вычесть.
по мани менеджемнту ни чего сказать не могу. не пробовал.
Приложил последнюю редакцию. Но там я уже все запутал сам для себя)
Order1(2) профит выбранного ордера
Order1(3) лот выбранного ордера
Заведите ещё один никчёмный input и его меняйте.
А чтобы без ручного вмешательства? В мт4 у меня есть индикаторы которые устанавливаются один на другой, причем я не знаю почему. Хотелось бы и в мт5 также, да и вообще понять от чего это зависит.