собрал советник который при открытии в ручную ордеров выставляет теик и стопы и сопровождает трелингом. все работает хорошо
решил добавить функцию общего убытка на случай если вдруг буду жадничать и выставлять больше одного ордера. но что то делаю не так
//+------------------------------------------------------------------+
//| мы решаем СТОПЫ ЭТО ОБЯЗАТЕЛЬНО.И ВОТ ЧТОБЫ НЕ ЗАБЫТЬ .Я ВАШ ПОМОШНИК.mq4
//| Copyright Copyright 2021, MetaQuotes Software Corp.
//| https://www.mql5.com
//+------------------------------------------------------------------+
//--------------------------------------------------------------------
extern double Loss = -90.0; //Общий убыток $ (=0 откл)
extern int Stoploss = 100, //стоплосс, если 0 то не изменяется
Takeprofit = 400; //тейкпрофит, если 0 то не изменяется
extern int TrailingStop = 20; //длинна тралла, если 0 то нет тралла
extern int StepTrall = 1; //шаг тралла - перемещать стоплосс не ближе чем StepTrall
extern int NoLoss = 10, //перевод в безубыток при заданном кол-ве пунктов прибыли, если 0 то нет перевода в безубыток
MinProfitNoLoss = 0; //минимальная прибыль при переводе вбезубыток
extern int Magic = -1 ; //Магик ордеров ( все ордера счетать всегда
//--------------------------------------------------------------------
int STOPLEVEL;
//--------------------------------------------------------------------
int init()
{
return(0);
}
//--------------------------------------------------------------------
int deinit()
{
ObjectDelete("SLb");
ObjectDelete("SLs");
return(0);
}
//--------------------------------------------------------------------
int start()
{
STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
double OSL,OTP,OOP,StLo,SL,TP;
double ProfitS,ProfitB,LB,LS,NLb,NLs,price_b,price_s,OL;
int b,s,OT,OMN;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
OMN = OrderMagicNumber();
if (OrderSymbol() == Symbol())
{
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
OT = OrderType();
OL = OrderLots();
if (OT==OP_BUY)
{
price_b = price_b+OOP*OL;
b++; LB+= OL;
ProfitB+=OrderProfit()+OrderSwap()+OrderCommission();
}
if (OT==OP_SELL)
{
price_s = price_s+OOP*OL;
s++;LS+= OL;
ProfitS+=OrderProfit()+OrderSwap()+OrderCommission();
}
}
}
}
ObjectDelete("SLb");
ObjectDelete("SLs");
if (b>0)
{
NLb = NormalizeDouble(price_b/LB,Digits);
ObjectCreate("SLb",OBJ_ARROW,0,Time[0],NLb,0,0,0,0);
ObjectSet ("SLb",OBJPROP_ARROWCODE,6);
ObjectSet ("SLb",OBJPROP_COLOR, Blue);
}
if (s>0)
{
NLs = NormalizeDouble(price_s/LS,Digits);
ObjectCreate("SLs",OBJ_ARROW,0,Time[0],NLs,0,0,0,0);
ObjectSet ("SLs",OBJPROP_ARROWCODE,6);
ObjectSet ("SLs",OBJPROP_COLOR, Red);
}
int OTicket;
for (i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol())
{
OT = OrderType();
OSL = NormalizeDouble(OrderStopLoss(),Digits);
OTP = NormalizeDouble(OrderTakeProfit(),Digits);
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
SL=OSL;TP=OTP;
if (OT==OP_BUY)
{
b++;
if (OSL==0 && Stoploss>=STOPLEVEL && Stoploss!=0)
{
SL = NormalizeDouble(Bid - Stoploss * Point,Digits);
}
else SL=OSL;
if (OTP==0 && Takeprofit>=STOPLEVEL && Takeprofit!=0)
{
TP = NormalizeDouble(Ask + Takeprofit * Point,Digits);
}
else TP=OTP;
if (NoLoss>=STOPLEVEL && OSL<NLb && NoLoss!=0)
{
if (OOP<=NLb && NLb!=0 && NLb <= NormalizeDouble(Bid-NoLoss*Point,Digits))
SL = NormalizeDouble(NLb+MinProfitNoLoss*Point,Digits);
}
if (TrailingStop>=STOPLEVEL && TrailingStop!=0)
{
StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits);
if (StLo>=NLb && NLb!=0) if (StLo > OSL) SL = StLo;
}
if (SL != OSL || TP != OTP)
{
OTicket=OrderTicket();
if (!OrderModify(OTicket,OOP,SL,TP,0,White)) Print("Error OrderModify ",GetLastError());
}
}
if (OT==OP_SELL)
{
s++;
if (OSL==0 && Stoploss>=STOPLEVEL && Stoploss!=0)
{
SL = NormalizeDouble(Ask + Stoploss * Point,Digits);
}
else SL=OSL;
if (OTP==0 && Takeprofit>=STOPLEVEL && Takeprofit!=0)
{
TP = NormalizeDouble(Bid - Takeprofit * Point,Digits);
}
else TP=OTP;
if (NoLoss>=STOPLEVEL && (OSL>NLs || OSL==0) && NoLoss!=0)
{
if (OOP>=NLs && NLs!=0 && NLs >= NormalizeDouble(Ask+NoLoss*Point,Digits))
SL = NormalizeDouble(NLs-MinProfitNoLoss*Point,Digits);
}
if (TrailingStop>=STOPLEVEL && TrailingStop!=0)
{
StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits);
if (StLo<=NLs && NLs!=0) if (StLo < OSL || OSL==0) SL = StLo;
}
if ((SL != OSL || OSL==0) || TP != OTP)
{
OTicket=OrderTicket();
if (!OrderModify(OTicket,OOP,SL,TP,0,White)) Print("Error OrderModify ",GetLastError());
}
}
}
}
}
if (IsTesting())
{
if (OrdersTotal()==0)
{
if (OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),3,0,0,"тест",0,0,Blue)==-1) Print("Error OrderSend ",GetLastError());
if (OrderSend(Symbol(),OP_SELL,0.1,NormalizeDouble(Bid,Digits),3,0,0,"тест",0,0,Red)==-1) Print("Error OrderSend ",GetLastError());
}
}
return(0);
}
//+----------------------------------------------------------------------------+
//| Закрытие всех позиций по общему убытку таблетка от жадности |
//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//| Функция определения количества пунктов в идущих подряд убыточных ордерах |
//| Параметры: |
//| sy - наименование инструмента ("" - любой символ, |
//| NULL - текущий символ) |
//| op - операция (-1 - любая позиция) |
//| mn - MagicNumber (-1 - любой магик) |
//| dt - Дата и время в секундах с 1970 года ( 0 - с начала истории) |
//+----------------------------------------------------------------------------+
int NumberOfLastLossPosFromDateInPoint(string sy="", int op=-1, int mn=-1, datetime dt=0) {
int i, k=OrdersHistoryTotal();
int kp=0;
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (dt<OrderCloseTime()) {
if (OrderProfit()<0)
{
kp += (MathAbs(OrderOpenPrice()-OrderClosePrice())) / Point;
}
else kp=0;
}
}
}
}
}
}
return(kp);
}
//+----------------------------------------------------------------------------+
//| Закрытие определенных позиций, у которых убыток в валюте депозита |
//| на данный момент больше чем некоторое значение |
//+----------------------------------------------------------------------------+
//Описание : Закрытие тех позиций, у которых убыток в валюте депозита
//превысил некоторое значение
//Параметры:
//sy - наименование инструмента ("" - любой символ,NULL - текущий символ)
//op - операция (-1 - любая позиция)
//mn - MagicNumber (-1 - любой магик)
//pr - профит/убыток
void ClosePosBySizeLossInCurrency(string sy="", int op=-1, int mn=-1, double pr=0) {
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (OrderProfit()+OrderSwap()<-MathAbs(pr)) ClosePosBySizeLossInCurrency();
}
}
}
}
}
}
//+----------------------------------------------------------------------------+
//| вот вроде и собрал чудо |
//+----------------------------------------------------------------------------+
Комментарии (39)
добавил
Редактирован: 29 декабря 2021, 09:13
6 eduard9898 Автор Сообщений: 81
16 ssg Сообщений: 817
16 ssg Сообщений: 817
16 ssg Сообщений: 817
16 ssg Сообщений: 817
Теперь в функции int start() (лучше заменить ее на void OnTick()) надо прописать условия вызова этой функции:
16 ssg Сообщений: 817
16 ssg Сообщений: 817
16 ssg Сообщений: 817
я добовлял от кима функции но не понимаю главной ошибки что раньше и как сложить
буду дальше пробывать.я так понимаю что сейчас надо все это вместе соединить.
да я поменял слова ( я понимаю что должны быть условия и должно быть выполнение их и это разные вещи) т.к вылетала ошибка — зато ошибок не стало Редактирован: 29 декабря 2021, 13:42
6 eduard9898 Автор Сообщений: 81
6 eduard9898 Автор Сообщений: 81
2.«да я поменял слова »!!! Понимаете в чем проблема: машина не человек и она понимает только машинный язык.Для неё «желтый лист» и «лист желтый» это две разные переменные (или команды).
3.Советник (его логика) выбран не очень удачно ИМХО.
4.Для вас я переписал ваш советник (логику оставил прежнюю) максимально упростив код и снабдив комментариями.
5.Разберитесь с кодом, а потом будете добавлять нужные функции.Например трал, бу и другие.Посмотрите в базе примеры. У Андрея почти все советники собраны из отдельных функций поэтому можно достаточно легко будет разобраться.Да они очень простые, но для самообразования самое то.
6.Мы все учимся чему то до самой смерти.Так что ничего страшного нет в ошибках.
16 ssg Сообщений: 817
16 ssg Сообщений: 817
16 ssg Сообщений: 817
еще раз спасибо за понимание. все сделал. сейчас надо добавлять стопы и тейки и т.д Редактирован: 29 декабря 2021, 18:23
6 eduard9898 Автор Сообщений: 81
Предупреждения — это не очень хорошо, но не критично.
К стати в упрощенном варианте нет даже предупреждений, а в вашем авторском уже изначально было куча предупреждения, но править я их не стал.Сами подумайте что не так прописано.С ними советник работает, но на реал он такого может наворотить… У вас в советнике и функции Игоря Кима, а главная функция от cmillion(а). У них совершенно разный подход построения алгоритма.По этому примитивно их срастить без предупреждений нельзя.
И еще, обратите внимание на строку в начале
она обязательно должна быть у вас скачена.Если нету то скачайте через поисковик.
У Кима все функции построены через эту библиотеку.
16 ssg Сообщений: 817
6 eduard9898 Автор Сообщений: 81
Все работает.При компиляции выдает:
Ошибок нет, но 19 предупреждений.
Все они в куске кода от cmillion(а).
Но это не значит, что он не правильно написал.Там я уверен все в порядке.
Это вы что то не так или не все правильно перенесли в свой советник.
Если за комментировать и не использовать
тогда при компеляции выдается одна ошибка
16 ssg Сообщений: 817
а началось все с того что старался зайти в минус — добился что слил все что за день натыркал и пришло понимание
думаю что попробую взять все что можно от кима тогда манера написания будет одна и проще будет найти ошибки Редактирован: 29 декабря 2021, 18:48
6 eduard9898 Автор Сообщений: 81
Правда немного разнообразил условия торговли.
Добавил следующие:
1.Позиции открываются только раз в сутки по времени extern int Starthour = 8;
при условии что ни одной открытой позиции нет.
2.При открытии позиций (и бай и селл) у них сразу выставляется тейпрофит.По
желанию можете выставить и стоплосс.
3.В моем варианте закрытие происходит:
либо по тейкпрофиту;
либо при наступлении времени extern int Endhour = 23; закрываются все
позиции у которых есть убыток не менее extern double loss = 10.0;
Разбирайтесь.Дописывайте свои варианты входов и выходов
В плане написания оба и Ким и cmillion пишут грамотные коды.Просто стиль разный. Редактирован: 29 декабря 2021, 19:45
16 ssg Сообщений: 817
16 ssg Сообщений: 817
хотел добавить что я торгую в ручную поэтому сам советник только нужен для
1.выстовляет стопы и тейк
2. трал
3. закрытие по общему минусу (на случай что зашел не одним ордером) Редактирован: 29 декабря 2021, 20:38
6 eduard9898 Автор Сообщений: 81
один от Кима на один граф следит за общим счетом. другой от Владимира на второй ставит стопы тейки и трелинг. все работает и все хорошо.
спасибо за помощь. если кого интересует — советник от Ким Игорь e-CloseByLossOrProfit
Советник закрывает все позиции при достижении заданного уровня убытка или профита в валюте депозита.
советник от Владимира cmillion TrailingStopLight
выставляет автоматом стопы и тейк. переводит в безубыток и тралит позиции
6 eduard9898 Автор Сообщений: 81
Только у этого решения есть две загвоздки:
1.Не возможно такую комбинацию и стратегию протестировать на истории.
2.Такое решение не приближает к умению самостоятельного написания программных
кодов.
Ну это ваше решение.
16 ssg Сообщений: 817
20 alex30774 Сообщений: 748
2.Есть куча сайтов где обучают азам написания, например book.mql4.com/ru/appendix/examples
3.В процессе обучения надо программировать самому, исправлять ошибки, а если не
получается можно и спросить совета или помочь в решении.Пока автор задавал
вопросы ему подсказывали где могут быть ошибки.
4.Посмотрите название темы. Там просьба помочь с решением, а не просьба
написать советник стороннему автору.«Почувствуйте разницу».
5.Все вышеизложенное имеет смысл только тогда, когда есть желание научиться
программировать.
Ну а если нет желания, то ничего страшного и криминального.Наверное есть другие резоны и интересы.
16 ssg Сообщений: 817
Зато ветка называется:«Напишу исправлю советник индикатор» именно с просьбой об исправлении своего советника он и обратился и тему назвал соответствующе.
Он просил добавить или исправить, а не нравоучения на тему(иди учи програмирование). Редактирован: 31 декабря 2021, 14:28
20 alex30774 Сообщений: 748
Так что какие могут быть претензии?
Выше я написал-было бы желание изучать.А если человек это делать не хочет — в данной ситуации это его законное право.
5.Все вышеизложенное имеет смысл только тогда, когда есть желание научиться
программировать.
Ну а если нет желания, то ничего страшного и криминального.Наверное есть другие резоны и интересы.
16 ssg Сообщений: 817
С наступающим Новым Годом!
16 ssg Сообщений: 817
20 alex30774 Сообщений: 748
16 ssg Сообщений: 817
6 eduard9898 Автор Сообщений: 81
Часть первая — подготовительная.
Редактирован: 31 декабря 2021, 16:59
16 ssg Сообщений: 817
16 ssg Сообщений: 817
6 eduard9898 Автор Сообщений: 81
пишет предупреждение сделал так исходя из того части с знаком равно перестало — вопрос или так можно
int STOPLEVEL =( int ) MarketInfo(OrderSymbol(),MODE_STOPLEVEL);
6 eduard9898 Автор Сообщений: 81
Может быть стоит логику советника изменить?
16 ssg Сообщений: 817
еще раз советник должен:
1.подхватывать все ордера открытые в ручную и выставлять
а. стопы (регулировать в пунктах )
б. тейки (регулировать в пунктах )
2.трелинг стоп с сразу по 1 пункту ( т.е сразу передвигать стопы в сторону безубытка)
3. считать общий убыток и по возможности его тоже переносить в безубыток (тралить)
вроде все. если есть что то что может помочь чтобы выходить с мин. потерями то тоже прописать.
6 eduard9898 Автор Сообщений: 81
А стратегия совсем не интересна. Смотрите на сайте :https://cmillion.ru/
Обязательно что-то подберете.И пробуйте писать сами.
16 ssg Сообщений: 817
6 eduard9898 Автор Сообщений: 81
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий