Здравствуйте. Пишу к советнику цикл модифицирования ордеров.
Модификация проходит только после первого закрытия по тейкпрофиту.
Прошу помощи, доработать цикл.
Нужно что бы ордер модифицировался после каждого закрытия противоположного ордера по
профиту.
Советник прилагается.
NEW_Stochastic.mq4 (11 Kb)
Комментарии (12)
18 GAWroch Сообщений: 84 - Вячеслав
//| NEW_Stochastic.mq4 |
//| Copyright 2019, MetaQuotes Software Corp. |
//| www.mql5.com |
//+------------------------------------------------------------------+
#property copyright «Copyright 2019, MetaQuotes Software Corp.»
#property link «www.mql5.com»
#property version «1.00»
#property strict
//+------------------------------------------------------------------+
//input double lot= 0.01;
input double RiskPercent = 2;
input double K_TP = 3; // Соотношение SL к ПРОФИТ
input double K_PR_B = 3; // Процент перемещения SL от ТР Buy
input double K_PR_S = 5; // Процент перемещения SL от ТР Sell
extern bool _modifi = true; // вкл. модификацию
input int magic = 20201218;
//+------------------------------------------------------------------+
//| Расчет риска в % от величины SL |
//+------------------------------------------------------------------+
double CalculateLot(double _stop) {
double loss = _stop / MarketInfo(_Symbol, MODE_TICKSIZE) * MarketInfo(_Symbol, MODE_TICKVALUE);
double lots = AccountFreeMargin() * RiskPercent / 100 / loss;
return (NormalizeDouble(MathMin(MarketInfo(_Symbol, MODE_MAXLOT), MathMax(MarketInfo(_Symbol, MODE_MINLOT), lots)), 2));
}
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу |
//+------------------------------------------------------------------+
int CountOrders(int type=-1)
{
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
{
if(OrderType()==type || type==-1)
count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if (_modifi)
{ _Modifi();
}
int r=0;
double stoch_1=iStochastic(_Symbol, _Period,21,2,3,MODE_SMA,1,MODE_MAIN,1);
double stoch_2=iStochastic(_Symbol, _Period,21,2,3,MODE_SMA,1,MODE_MAIN,2);
double ATR=NormalizeDouble(iATR(NULL,PERIOD_D1,21,1), Digits);
double TP=ATR*100000;
CountOrders();
if(stoch_1 > 20 && stoch_2 < 20 && NormalizeDouble(iHigh(Symbol(),0,1), Digits) < Ask && CountOrders(OP_BUY) < 1) {
r = OrderSend(Symbol(),
OP_BUY,
//NormalizeDouble(lot, 2),
CalculateLot(Ask — (NormalizeDouble(Ask — 0.3*TP*Point, Digits))),
Ask,
30,
/*NormalizeDouble(Ask — 0.3*TP*Point, Digits)*/0, //SL
NormalizeDouble(Ask + K_TP*TP*Point, Digits), //TP
«STOCHASTIC»,
magic,
0,
Blue); // BUY
}
else if(stoch_1 < 80 && stoch_2 > 80 && NormalizeDouble(iLow(Symbol(),0,1), Digits) > Bid && CountOrders(OP_SELL) < 1) {
r = OrderSend(Symbol(),
OP_SELL,
//NormalizeDouble(lot, 2),
CalculateLot((NormalizeDouble(Bid + 0.3*TP*Point, Digits)) — Bid),
Bid,
30,
/* NormalizeDouble(Bid + 0.3*TP*Point, Digits)*/0, //SL
NormalizeDouble(Bid — K_TP*TP*Point, Digits), //TP
«STOCHASTIC»,
magic,
0,
Red); // SELL
}
}
//+------------------------------------------------------------------+
void _Modifi(){
int i;
bool m;
double _profitByu=0.0, _profitSell=0.0;
for (i=OrdersHistoryTotal()-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
if (OrderType()==OP_BUY && OrderProfit()>0)
if (OrderProfit()>0) _profitByu += NormalizeDouble(OrderProfit()*Point*K_PR_S,Digits);
if (OrderProfit() < 0) _profitByu = 0;
if (OrderType()==OP_SELL && OrderProfit()>0)
if (OrderProfit()>0) _profitSell += NormalizeDouble(OrderProfit()*Point*K_PR_B,Digits);
if (OrderProfit() < 0) _profitSell = 0;
{
Comment(«Посчитаем профит:» ,"\n",«Buy = »,_profitByu,
" Sell = ", _profitSell);
}
for (i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS)){
if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic){
if (OrderType()==OP_BUY && _profitSell > 0){
m = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),
NormalizeDouble(OrderOpenPrice()-_profitSell ,Digits),OrderExpiration(),CLR_NONE);
}
if (OrderType()==OP_SELL && _profitByu > 0){
m = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),
NormalizeDouble(OrderOpenPrice()+_profitByu ,Digits),OrderExpiration(),CLR_NONE);
}
}
}
}
}
}
return;
}
9 droba Автор Сообщений: 239 - Droba
45 Bishop Сообщений: 5811 - АЛЬФАХАМЕЦ-Машковод
35 AM2 Сообщений: 16388 - Андрей
К нему нужно добавить модификацию ордеров. Как пример, в рынке два разнонаправленных ордера (без SL) один закрывается по ТП, а другой модифицируется, т.е. ТП переносится в отрицательную зону на 30% от прибыли закрывшегося ордера и цикл работает до тех пор пока не закроется убыточный ордер. Скажем так BUY мы модифицируем с отрицательным ТП, а SELL открывается снова после закрытия по ТП. В общем смысл стратегии — сначала забираем прибыль, а потом рассчитываем SL от этой прибыли в размере 30%. Процент вынести в переменные советника.
9 droba Автор Сообщений: 239 - Droba
18 GAWroch Сообщений: 84 - Вячеслав
А исходник можно? Редактирован: 20 мая 2021, 08:36
9 droba Автор Сообщений: 239 - Droba
18 GAWroch Сообщений: 84 - Вячеслав
А вот торговля по этой системе, ордера открывает советник, модификация в ручную.
История с 14 мая до сегодняшнего дня. Редактирован: 20 мая 2021, 09:22
9 droba Автор Сообщений: 239 - Droba
Всё в первоначальном виде… вроде.
Редактирован: 20 мая 2021, 09:25
18 GAWroch Сообщений: 84 - Вячеслав
Нужно что б он передвигал ТР у отрицательного ордера после каждого положительно закрытого ордера.
Это как тралят SL за ценой у плюсовых ордеров тут то же самое только тралим ТП у отрицательных ордеров и после того как противоложный ордер закрылся с положительным ТП.
9 droba Автор Сообщений: 239 - Droba
18 GAWroch Сообщений: 84 - Вячеслав
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий