Там не могу понять установки стоп лосса и тейк профита, в функции там у них общий один сmd = OP_SELL, cmd=OP_BUY........... может сделать их разными типа cmd1 и cmd2?
И лот не понимаю как его сделать настраиваемым по риску?
int Deal(int act, double Lot) { int N = 0; int ticket; int err; double Price_open; double Lots; int cmd; int magik; magik = GenericMagik(); Lots = NormalizeDouble(Lot,1); if(act == 1) { Price_open = NormalizeDouble(Ask, Digits); cmd = OP_BUY; } if(act == 2) { Price_open = NormalizeDouble(Bid, Digits); cmd = OP_SELL; } // проверака маржи для открытия позиции AccountFreeMarginCheck(Symbol(), cmd,Lots); err = GetLastError(); if(err>0) { Print("No money for new position"); NoOpen = true; return(0); } // Отсылаем ордер ticket = OrderSend(Symbol(), cmd, Lots, Price_open, slippage, 0, 0, 0, magik); if(ticket > 0) { deals++; return(ticket); } // Если не отослался, то пытаемся 5 раз снова его открыть else { while(N < count) { N++; err = ErrorBlock(); if(err == 1) { Sleep(5000); RefreshRates(); if(act == 1) Price_open = NormalizeDouble(Ask, Digits); if(act == 2) Price_open = NormalizeDouble(Bid, Digits); ticket = OrderSend(Symbol(), cmd, Lots, Price_open, slippage, 0, 0, 0, magik); if(ticket > 0) { deals++; return(ticket); } } // получили серьезную ошибку if(err > 1) return(0); } } return(0); }
Вот так будет это корректно работать, я вставил два ticket с разными cmd теперь если я установлю стоплосс и тейк профит то должны они выставится? Или я не правильно внес изменения в функцию?
int Deal(int act, double Lot) { int N = 0; int ticket; int err; double Price_open; double Lots; int cmd1,cmd2; int magik; magik = GenericMagik(); Lots = NormalizeDouble(Lot,1); if(act == 1) { Price_open = NormalizeDouble(Ask, Digits); cmd1 = OP_BUY; } if(act == 2) { Price_open = NormalizeDouble(Bid, Digits); cmd2 = OP_SELL; } // проверака маржи для открытия позиции AccountFreeMarginCheck(Symbol(), cmd1,Lots); AccountFreeMarginCheck(Symbol(), cmd2,Lots); err = GetLastError(); if(err>0) { Print("Нет денег на новую позицию"); NoOpen = true; return(0); } // Отсылаем ордер ticket = OrderSend(Symbol(), cmd1, Lots, Price_open, slippage, 0, 0, 0, magik); ticket = OrderSend(Symbol(), cmd2, Lots, Price_open, slippage, 0, 0, 0, magik); if(ticket > 0) { deals++; return(ticket); } // Если не отослался, то пытаемся 5 раз снова его открыть else { while(N < count) { N++; err = ErrorBlock(); if(err == 1) { Sleep(5000); RefreshRates(); if(act == 1) Price_open = NormalizeDouble(Ask, Digits); ticket = OrderSend(Symbol(), cmd1, Lots, Price_open, slippage, 0, 0, 0, magik); if(act == 2) Price_open = NormalizeDouble(Bid, Digits); ticket = OrderSend(Symbol(), cmd2, Lots, Price_open, slippage, 0, 0, 0, magik); if(ticket > 0) { deals++; return(ticket); } } // получили серьезную ошибку if(err > 1) return(0); } } return(0); }
нет. что то вы вообще не туда пошли. Перед тем как делать, надо понять что делать. а не куда-попало в код что-то писать с мыслью а вдруг заработает.
у вас пробелы в знаниях. Вот тут:
Пробел в знаниях МКЛ есть, можно сказать что знаний вообще нет ни каких, я только изучать начал, этот код взял как бы за шаблон так как тема написана "Как разработать надежный и безопасный торговый робот на языке MQL4" Думаю автор обманывать не будет что его шаблон советника самый надежный.
Спасибо за ссылки, пока мне понять сложно я буду методом тыка пробовать. Умные люди надеюсь подправят, здесь смотрю их много ходят особенно математиков.
Вот так, правильно ли я понял?
Правильно ли сделано до пункта:
//----- Отсылаем ордер ---------------------------------------------------------------int Deal(int act, double Lot) { int N = 0; int ticket; int err; double Price_open; double Lots; int cmd1,cmd2; int magik; magik = GenericMagik(); Lots = NormalizeDouble(Lot,1); //----- Бай позиция ----------------------------------------- if(act == 1) { Price_open = NormalizeDouble(Ask, Digits); cmd1 = OP_BUY; // проверака маржи для открытия позиции BUY AccountFreeMarginCheck(Symbol(), cmd1,Lots); err = GetLastError(); if(err>0) { Print("Нет денег на новую позицию"); NoOpen = true; return(0); } } //----- Селл позиция ---------------------------------------- if(act == 2) { Price_open = NormalizeDouble(Bid, Digits); cmd2 = OP_SELL; } // проверака маржи для открытия позиции SELL AccountFreeMarginCheck(Symbol(), cmd2,Lots); err = GetLastError(); if(err>0) { Print("Нет денег на новую позицию"); NoOpen = true; return(0); } //----- Отсылаем ордер --------------------------------------------------------------- ticket = OrderSend(Symbol(), cmd1, Lots, Price_open, slippage, 0, 0, 0, magik); if(ticket > 0) { deals++; return(ticket); } // Если не отослался, то пытаемся 5 раз снова его открыть else { while(N < count) { N++; err = ErrorBlock(); if(err == 1) { Sleep(5000); RefreshRates(); if(act == 1) Price_open = NormalizeDouble(Ask, Digits); ticket = OrderSend(Symbol(), cmd1, Lots, Price_open, slippage, 0, 0, 0, magik); if(act == 2) Price_open = NormalizeDouble(Bid, Digits); ticket = OrderSend(Symbol(), cmd2, Lots, Price_open, slippage, 0, 0, 0, magik); if(ticket > 0) { deals++; return(ticket); } } // получили серьезную ошибку if(err > 1) return(0); } } return(0); }
Вот так, правильно ли я понял?
Правильно ли сделано до пункта:
//----- Отсылаем ордер ---------------------------------------------------------------до строки //----- Отсылаем ордер ---------------------------------------------------------------
сделано правильно в том смысле, что сделано правильно. Но то ли вам надо, что вы там написали. давайте выясним.
начнём всё с самого начала. Проведём так сказать ликбез.
1. Откуда (из какой функции) вы будете вызывать функцию Deal() ?
2. Что будете в неё передавать?
до строки //----- Отсылаем ордер ---------------------------------------------------------------
сделано правильно в том смысле, что сделано правильно. Но то ли вам надо, что вы там написали. давайте выясним.
начнём всё с самого начала. Проведём так сказать ликбез.
1. Откуда (из какой функции) вы будете вызывать функцию Deal() ?
2. Что будете в неё передавать?
1. Функция Del() вызывается функцией start() - правильно?
2. Открытие ордера с выставленными стопами и тейкпрофитом и лотом по риску, плюс закрытие по close
Проверьте функцию, теперь все правильно вроде должен выставляться тейкпрофит и стоплос?
int Deal(int act, double Lot) { int N = 0; int ticket; int err; double Price_open; double Lots; int cmd1,cmd2; int magik; magik = GenericMagik(); Lots = NormalizeDouble(Lot,1); //------- Бай --------------------------------------- if(act == 1){ Price_open = NormalizeDouble(Ask, Digits); cmd1 = OP_BUY; }//act // проверка маржи для открытия позиции AccountFreeMarginCheck(Symbol(), cmd1,Lots); err = GetLastError(); if(err>0){ Print("Нет денег на новую позицию"); NoOpen = true; return(0); }//err //------- Селл -------------------------------------- if(act == 2){ Price_open = NormalizeDouble(Bid, Digits); cmd2 = OP_SELL; }//act // проверка маржи для открытия позиции AccountFreeMarginCheck(Symbol(), cmd2,Lots); err = GetLastError(); if(err>0){ Print("Нет денег на новую позицию"); NoOpen = true; return(0); }//err //------------------------------------------------------------------------------------- // Отсылаем ордер //---------------------- Buy ---------------------------------------------------------- ticket = OrderSend(Symbol(), cmd1, Lots, Price_open, slippage,Bid-StopLoss*Point,Ask+TakeProfit*Point, 0, magik); if(ticket > 0){ deals++; return(ticket); }//ticket // Если не отослался, то пытаемся 5 раз снова его открыть else{ while(N < count){ N++; err = ErrorBlock(); if(err == 1){ Sleep(5000); RefreshRates(); if(act == 1) Price_open = NormalizeDouble(Ask, Digits); ticket = OrderSend(Symbol(), cmd1, Lots, Price_open, slippage,Bid-StopLoss*Point,Ask+TakeProfit*Point, 0, magik); if(ticket > 0){ deals++; return(ticket); }//ticket }//err // получили серьезную ошибку if(err > 1) return(0); }//else }//while // Отсылаем ордер //---------------------- Sell --------------------------------------------------------- ticket = OrderSend(Symbol(), cmd2, Lots, Price_open, slippage, Ask+StopLoss*Point,Bid-TakeProfit*Point, 0, magik); if(ticket > 0){ deals++; return(ticket); }//ticket // Если не отослался, то пытаемся 5 раз снова его открыть else{ while(N < count){ N++; err = ErrorBlock(); if(err == 1){ Sleep(5000); RefreshRates(); if(act == 2) Price_open = NormalizeDouble(Bid, Digits); ticket = OrderSend(Symbol(), cmd2, Lots, Price_open, slippage, Ask+StopLoss*Point,Bid-TakeProfit*Point, 0, magik); if(ticket > 0){ deals++; return(ticket); }//ticket }//err // получили серьезную ошибку if(err > 1) return(0); }//else }//while return(0); }//Deal
Вот. отлично!
только небольшая ошибка в стопах. Для селл надо все относительно Ask, а для Бай всё относительно Бид.
ticket = OrderSend(Symbol(), cmd1, Lots, Price_open, slippage,Bid-StopLoss*Point,Bid+TakeProfit*Point, 0, magik); ticket = OrderSend(Symbol(), cmd2, Lots, Price_open, slippage, Ask+StopLoss*Point,Ask-TakeProfit*Point, 0, magik);

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте, покажите как добавить стоплосс и тейкпрофит, и функцию лота с риском с настройками в этот шаблон советник.
Спасибо!
https://www.mql5.com/ru/articles/1462