Разработка универсального и работающего шаблона для экспертов. - страница 3

 
Ордерсселект в цикле, подсчёт кол-ва позиций с заданным Мейджиком, проверка - бай или селл, присвоение соответствующим переменным значения (например _BuyTicket и _SellTicket)
Потом проверка - если _BuyTicket больше 0 а _SellTicket == 0, открываем селл. Если _BuyTicket == 0, открываем бай. Если и та и та == 0, открываем 2 позиции
 
komposter:
Ордерсселект в цикле, подсчёт кол-ва позиций с заданным Мейджиком, проверка - бай или селл, присвоение соответствующим переменным значения (например _BuyTicket и _SellTicket)
Потом проверка - если _BuyTicket больше 0 а _SellTicket == 0, открываем селл. Если _BuyTicket == 0, открываем бай. Если и та и та == 0, открываем 2 позиции
Спасибо за подсказку, а кодом разжиться не поможешь?
 
не ленись сам написать. это же просто )
а код - у меня готовые куски, попробую вырезать нужный тебе фрагмент.

только напомни мне завтра здесь или на мыло, ок?
 
komposter:
не ленись сам написать. это же просто )
а код - у меня готовые куски, попробую вырезать нужный тебе фрагмент.

только напомни мне завтра здесь или на мыло, ок?
Приветствую и сразу напоминаю про куски кода. Сам пытался сделать разными вариантами, но нужного результата так и не достиг. В работе получается что есть 2 ордера, но они могут быть по разным валютам. А нужно что-бы по каждой было 2 одновременно. всю голову сломал, кучу чужих кусков перепробывал, свои писал, ну никак с мертвой точки сдвинуться не могу. А этот момент как один из заключительный к очень интересному проекту. Связан он напрямую с этой веткой и с универсальным шаблоном.
 
Вот кстате интересно что общественность скажет по поводу вот такой вот реализации универсального шаблона. Может быть кое какие стрелки не так поставлены, но будем разбераться вместе, главное что-бы это кого-то да заинтересовало.
Файлы:
temples_116.jpg  23 kb
 
Что-то Вы SKif и komposter пописали, пописали, да и замолчали.
Так обещенной помощи от Вас не дождаться что ли?
 
HIDDEN:
Что-то Вы SKif и komposter пописали, пописали, да и замолчали.
Так обещенной помощи от Вас не дождаться что ли?
Помощь - дело добровольное.
Не нужно раздражать людей навязчивостью.
 
HIDDEN ,
komposter:
не ленись сам написать. это же просто )
Компостер абсолютно прав.
Извини, но если ты не можешь сам написать такой простой код, то тебе не нужна помощь.
Писать ВМЕСТО тебя никто ничего не будет.
Здесь могут указать на ошибку, немного подсказать, посоветовать тот или иной метод обработки информации. В данном случае, я думаю, для начала тебе нужно тщательно проштудировать пример эксперта, предоставленный разработчиками. Позднее хорошо бы самостоятельно написать несколько простых, но работающих функций.

В самом деле, не ленись. Если сразу не получится, то надо почитать ещё раз словарь в МЕ, посмотреть работающие эксперты, добиться понимания каждой строки в коде. Так, постепенно ты научишься. Но надо же это делать. Другого пути нет.

Надеюсь, без обид.
 
ф-ция, о которой я говорил в асе:
int _ExpertOrders = 0; int _MarketOrders = 0; int _PendingOrders = 0; int _BuyTicket = 0; double _BuyLots = 0.0; double _BuyOpenPrice = 0.0; double _BuyStopLoss = 0.0; double _BuyTakeProfit = 0.0; datetime _BuyOpenTime = -1; double _BuyProfit = 0.0; double _BuySwap = 0.0; double _BuyCommission = 0.0; string _BuyComment = ""; int _SellTicket = 0; double _SellLots = 0.0; double _SellOpenPrice = 0.0; double _SellStopLoss = 0.0; double _SellTakeProfit = 0.0; datetime _SellOpenTime = -1; double _SellProfit = 0.0; double _SellSwap = 0.0; double _SellCommission = 0.0; string _SellComment = ""; int _BuyStopTicket = 0; double _BuyStopLots = 0.0; double _BuyStopOpenPrice = 0.0; double _BuyStopStopLoss = 0.0; double _BuyStopTakeProfit = 0.0; datetime _BuyStopOpenTime = -1; string _BuyStopComment = ""; datetime _BuyStopExpiration = -1; int _SellStopTicket = 0; double _SellStopLots = 0.0; double _SellStopOpenPrice = 0.0; double _SellStopStopLoss = 0.0; double _SellStopTakeProfit = 0.0; datetime _SellStopOpenTime = -1; string _SellStopComment = ""; datetime _SellStopExpiration = -1; int _BuyLimitTicket = 0; double _BuyLimitLots = 0.0; double _BuyLimitOpenPrice = 0.0; double _BuyLimitStopLoss = 0.0; double _BuyLimitTakeProfit = 0.0; datetime _BuyLimitOpenTime = -1; string _BuyLimitComment = ""; datetime _BuyLimitExpiration = -1; int _SellLimitTicket = 0; double _SellLimitLots = 0.0; double _SellLimitOpenPrice = 0.0; double _SellLimitStopLoss = 0.0; double _SellLimitTakeProfit = 0.0; datetime _SellLimitOpenTime = -1; string _SellLimitComment = ""; datetime _SellLimitExpiration = -1; ///////////////////////////////////////////////////////////////////////////////// /**/ void _ExpertOrdersInit( int _MagicNumber ) ///////////////////////////////////////////////////////////////////////////////// // Можно использовать, если эксперт устанавливает максимум ОДИН ордер одного типа (OP_BUY, OP_SELL, и т.д.) // Присваивает значения переменным, перечисленным выше. Их можно использовать из эксперта для упрощения кода. ///////////////////////////////////////////////////////////////////////////////// { int _GetLastError; _ExpertOrders = 0; _MarketOrders = 0; _PendingOrders = 0; _BuyTicket = 0; _BuyLots = 0.0; _BuyOpenPrice = 0.0; _BuyStopLoss = 0.0; _BuyTakeProfit = 0.0; _BuyOpenTime = -1; _BuyProfit = 0.0; _BuySwap = 0.0; _BuyCommission = 0.0; _BuyComment = ""; _SellTicket = 0; _SellLots = 0.0; _SellOpenPrice = 0.0; _SellStopLoss = 0.0; _SellTakeProfit = 0.0; _SellOpenTime = -1; _SellProfit = 0.0; _SellSwap = 0.0; _SellCommission = 0.0; _SellComment = ""; _BuyStopTicket = 0; _BuyStopLots = 0.0; _BuyStopOpenPrice = 0.0; _BuyStopStopLoss = 0.0; _BuyStopTakeProfit = 0.0; _BuyStopOpenTime = -1; _BuyStopComment = ""; _BuyStopExpiration = -1; _SellStopTicket = 0; _SellStopLots = 0.0; _SellStopOpenPrice = 0.0; _SellStopStopLoss = 0.0; _SellStopTakeProfit = 0.0; _SellStopOpenTime = -1; _SellStopComment = ""; _SellStopExpiration = -1; _BuyLimitTicket = 0; _BuyLimitLots = 0.0; _BuyLimitOpenPrice = 0.0; _BuyLimitStopLoss = 0.0; _BuyLimitTakeProfit = 0.0; _BuyLimitOpenTime = -1; _BuyLimitComment = ""; _BuyLimitExpiration = -1; _SellLimitTicket = 0; _SellLimitLots = 0.0; _SellLimitOpenPrice = 0.0; _SellLimitStopLoss = 0.0; _SellLimitTakeProfit = 0.0; _SellLimitOpenTime = -1; _SellLimitComment = ""; _SellLimitExpiration = -1; int _OrdersTotal = OrdersTotal(); for ( int z = _OrdersTotal - 1; z >= 0; z -- ) { if ( !OrderSelect( z, SELECT_BY_POS ) ) { _GetLastError = GetLastError(); Print( "trade_lib&info_lib - _ExpertOrdersInit( ", _MagicNumber, " ) - OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" ); continue; } if ( OrderMagicNumber() == _MagicNumber && OrderSymbol() == _Symbol ) { int _OrderType = OrderType(); int _OrderTicket = OrderTicket(); double _OrderLots = NormalizeDouble( OrderLots(), 1 ); double _OrderOpenPrice = NormalizeDouble( OrderOpenPrice(), _Digits ); double _OrderStopLoss = NormalizeDouble( OrderStopLoss(), _Digits ); double _OrderTakeProfit = NormalizeDouble( OrderTakeProfit(), _Digits ); datetime _OrderOpenTime = OrderOpenTime(); double _OrderProfit = NormalizeDouble( OrderProfit(), 2 ); double _OrderSwap = NormalizeDouble( OrderSwap(), 2 ); double _OrderCommission = NormalizeDouble( OrderCommission(), 2 ); string _OrderComment = OrderComment(); datetime _OrderExpiration = OrderExpiration(); if ( _OrderType == OP_BUY ) { _MarketOrders ++; _BuyTicket = _OrderTicket; _BuyLots = _OrderLots; _BuyOpenPrice = _OrderOpenPrice; _BuyStopLoss = _OrderStopLoss; _BuyTakeProfit = _OrderTakeProfit; _BuyOpenTime = _OrderOpenTime; _BuyProfit = _OrderProfit; _BuySwap = _OrderSwap; _BuyCommission = _OrderCommission; _BuyComment = _OrderComment; } if ( _OrderType == OP_SELL ) { _MarketOrders ++; _SellTicket = _OrderTicket; _SellLots = _OrderLots; _SellOpenPrice = _OrderOpenPrice; _SellStopLoss = _OrderStopLoss; _SellTakeProfit = _OrderTakeProfit; _SellOpenTime = _OrderOpenTime; _SellProfit = _OrderProfit; _SellSwap = _OrderSwap; _SellCommission = _OrderCommission; _SellComment = _OrderComment; } if ( _OrderType == OP_BUYSTOP ) { _PendingOrders ++; _BuyStopTicket = _OrderTicket; _BuyStopLots = _OrderLots; _BuyStopOpenPrice = _OrderOpenPrice; _BuyStopStopLoss = _OrderStopLoss; _BuyStopTakeProfit = _OrderTakeProfit; _BuyStopOpenTime = _OrderOpenTime; _BuyStopComment = _OrderComment; _BuyStopExpiration = _OrderExpiration; } if ( _OrderType == OP_SELLSTOP ) { _PendingOrders ++; _SellStopTicket = _OrderTicket; _SellStopLots = _OrderLots; _SellStopOpenPrice = _OrderOpenPrice; _SellStopStopLoss = _OrderStopLoss; _SellStopTakeProfit = _OrderTakeProfit; _SellStopOpenTime = _OrderOpenTime; _SellStopComment = _OrderComment; _SellStopExpiration = _OrderExpiration; } if ( _OrderType == OP_BUYLIMIT ) { _PendingOrders ++; _BuyLimitTicket = _OrderTicket; _BuyLimitLots = _OrderLots; _BuyLimitOpenPrice = _OrderOpenPrice; _BuyLimitStopLoss = _OrderStopLoss; _BuyLimitTakeProfit = _OrderTakeProfit; _BuyLimitOpenTime = _OrderOpenTime; _BuyLimitComment = _OrderComment; _BuyLimitExpiration = _OrderExpiration; } if ( _OrderType == OP_SELLLIMIT ) { _PendingOrders ++; _SellLimitTicket = _OrderTicket; _SellLimitLots = _OrderLots; _SellLimitOpenPrice = _OrderOpenPrice; _SellLimitStopLoss = _OrderStopLoss; _SellLimitTakeProfit = _OrderTakeProfit; _SellLimitOpenTime = _OrderOpenTime; _SellLimitComment = _OrderComment; _SellLimitExpiration = _OrderExpiration; } } } _ExpertOrders = _MarketOrders + _PendingOrders; }
 
Добрый день.
Позволю себе запостить свой шаблон кода, может кому-то пригодится.
Пример МТС с этим кодом можно посмотреть на форуме нашего сайта.

//+------------------------------------------------------------------+ //| et4_MTC_v1.mq4 | //| goldenlion@ukr.net | //| http://GlobeInvestFund.com/ | //+------------------------------------------------------------------+ #property copyright "Copyright c 2005, goldenlion@ukr.net" #property link "http://GlobeInvestFund.com/" #include <stdlib.mqh> extern double TakeProfit = 150; extern double Lots = -10; extern double StopLoss = 50; extern double Slippage = 3; extern double LogOn = 0; /////////////////////////////////////////////// int newCandel = 0; //признак новой свечи int prev_candel_time = 0; int err; int ticket; int LastTradeTime; //+------------------------------------------------------------------+ //| Замена стандартным, регистрируют время события | //+------------------------------------------------------------------+ bool MOrderDelete( int ticket ) { LastTradeTime = CurTime(); return ( OrderDelete( ticket ) ); } bool MOrderClose( int ticket, double lots, double price, int slippage, color Color=CLR_NONE) { LastTradeTime = CurTime(); price = MathRound(price*10000)/10000; return ( OrderClose( ticket, lots, price, slippage, Color) ); } bool MOrderModify( int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE) { LastTradeTime = CurTime(); price = MathRound(price*10000)/10000; stoploss = MathRound(stoploss*10000)/10000; takeprofit = MathRound(takeprofit*10000)/10000; return ( OrderModify( ticket, price, stoploss, takeprofit, expiration, arrow_color) ); } int MOrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment="", int magic=0, datetime expiration=0, color arrow_color=CLR_NONE) { LastTradeTime = CurTime(); price = MathRound(price*10000)/10000; stoploss = MathRound(stoploss*10000)/10000; takeprofit = MathRound(takeprofit*10000)/10000; return ( OrderSend( symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color ) ); } //+------------------------------------------------------------------+ //| Рассчитаем лот | //+------------------------------------------------------------------+ double LotsCalc() { double Lots2 = Lots; if( Lots2 < 0 ) Lots2 = ( MathFloor( ( AccountBalance() /1000*(-Lots2))/10 )/10 ); if ( Lots2 < 0.1 ) return (0.1); return (Lots2); } //+------------------------------------------------------------------+ //| Выставляем уровни | //+------------------------------------------------------------------+ int CheckLevels() { //признак новой свечи if( prev_candel_time == Time[0] ) newCandel = 0; else { newCandel = 1; prev_candel_time = Time[0]; } //Ваш код return(0); } //+------------------------------------------------------------------+ //| Открываем позиции | //+------------------------------------------------------------------+ int OpenPos() { //Ваш код return(0); } //+------------------------------------------------------------------+ //| Сопровождаем | //+------------------------------------------------------------------+ int MovePos() { //Ваш код return(0); } //+------------------------------------------------------------------+ //| Закрываем позиции | //+------------------------------------------------------------------+ int ClosePos() { //Ваш код return(0); } //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //Ваш код return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //Ваш код return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if( CurTime() - LastTradeTime < 30 ) return (0); //задержка на 30 секунд если была перация CheckLevels(); //устанавливаем признаки по которым открываемся //если в функцифях производим операции с ордерами то обязательно сразу после этих операций //завершаем их операторм return(1) для того что бы прекратить дальнейшую работу советника //и выждать пауза пока отработает ордер if ( OpenPos() == 1 ) return(0); //только открытия позиций if ( MovePos() == 1 ) return(0); //только сопровождение позиций if ( ClosePos() == 1 ) return(0); //только закрытия и удаления ордеров return(0); } // the end.
Причина обращения: