初学者的问题 MQL5 MT5 MetaTrader 5 - 页 201 1...194195196197198199200201202203204205206207208...1503 新评论 StrangerNet 2014.02.19 18:52 #2001 barabashkakvn :在代码片段之前附加整个代码或初始化变量。您永远不知道变量中有什么,例如所有代码: //+------------------------------------------------------------------+ //| USSR.mq5 | //| Copyright 2014, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2014, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #include <Trade\Trade.mqh> //--- input parameters // Входные параметры input int StopLoss= 15 ; // Stop Loss input int TakeProfit= 30 ; // Take Profit input int ADX_Period= 8 ; // Период ADX input int MA_Period= 8 ; // Период Moving Average input int EA_Magic= 12345 ; // Magic Number советника input double Adx_Min= 22.0 ; // Минимальное значение ADX input double Lot= 0.01 ; // Количество лотов для торговли //--- глобальные переменные ulong tik= 0 ; int adxHandle; // хэндл индикатора ADX int maHandle; // хэндл индикатора Moving Average double plsDI[],minDI[],adxVal[]; // динамические массивы для хранения численных значений +DI, -DI и ADX для каждого бара double maVal[]; // динамический массив для хранения значений индикатора Moving Average для каждого бара double p_close; // переменная для хранения значения close бара int STP,TKP; // будут использованы для значений Stop Loss и Take Profit int TrailingStop=TakeProfit; double Bid; CTrade trade; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ //Инациализация советника int OnInit () { //--- Получить хэндл индикатора ADX adxHandle= iADX ( NULL , 0 ,ADX_Period); //--- Получить хэндл индикатора Moving Average maHandle= iMA ( _Symbol , _Period ,MA_Period, 0 , MODE_EMA , PRICE_CLOSE ); //--- Нужно проверить, не были ли возвращены значения Invalid Handle if (adxHandle< 0 || maHandle< 0 ) { Alert ( "Ошибка при создании индикаторов - номер ошибки: " , GetLastError (), "!!" ); return (- 1 ); } STP = StopLoss; TKP = TakeProfit; if ( _Digits == 5 || _Digits == 3 ) { STP = STP* 10 ; TKP = TKP* 10 ; } return ( 0 ); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ //Выключение советника void OnDeinit ( const int reason) { IndicatorRelease (adxHandle); IndicatorRelease (maHandle); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ //Обработка событий void OnTick () { while (tik== 0 ) { //--- Достаточно ли количество баров для работы if ( Bars ( _Symbol , _Period )< 60 ) // общее количество баров на графике меньше 60? { Alert ( "На графике меньше 60 баров, советник не будет работать!!" ); return ; } // Для сохранения значения времени бара мы используем static-переменную Old_Time. // При каждом выполнении функции OnTick мы будем сравнивать время текущего бара с сохраненным временем. // Если они не равны, это означает, что начал строится новый бар. static datetime Old_Time; datetime New_Time[ 1 ]; bool IsNewBar= false ; // копируем время текущего бара в элемент New_Time[0] int copied= CopyTime ( _Symbol , _Period , 0 , 1 ,New_Time); if (copied> 0 ) // ok, успешно скопировано { if (Old_Time!=New_Time[ 0 ]) // если старое время не равно { IsNewBar= true ; // новый бар if ( MQL5InfoInteger ( MQL5_DEBUGGING )) Print ( "Новый бар" ,New_Time[ 0 ], "старый бар" ,Old_Time); Old_Time=New_Time[ 0 ]; // сохраняем время бара } } else { Alert ( "Ошибка копирования времени, номер ошибки =" , GetLastError ()); ResetLastError (); return ; } //--- советник должен проверять условия совершения новой торговой операции только при новом баре if (IsNewBar== false ) { return ; } //--- Имеем ли мы достаточное количество баров на графике для работы int Mybars= Bars ( _Symbol , _Period ); if (Mybars< 60 ) // если общее количество баров меньше 60 { Alert ( "На графике менее 60 баров, советник работать не будет!!" ); return ; } //--- Объявляем структуры, которые будут использоваться для торговли MqlTick latest_price; // Будет использоваться для текущих котировок MqlTradeRequest mrequest; // Будет использоваться для отсылки торговых запросов MqlTradeResult mresult; // Будет использоваться для получения результатов выполнения торговых запросов MqlRates mrate[]; // Будет содержать цены, объемы и спред для каждого бара ZeroMemory (mrequest); /* Установим индексацию в массивах котировок и индикаторов как в таймсериях */ // массив котировок ArraySetAsSeries (mrate, true ); // массив значений индикатора ADX DI+ ArraySetAsSeries (plsDI, true ); // массив значений индикатора ADX DI- ArraySetAsSeries (minDI, true ); // массив значений индикатора ADX ArraySetAsSeries (adxVal, true ); // массив значений индикатора MA-8 ArraySetAsSeries (maVal, true ); //--- Получить текущее значение котировки в структуру типа MqlTick if (! SymbolInfoTick ( _Symbol ,latest_price)) { Alert ( "Ошибка получения последних котировок - ошибка:" , GetLastError (), "!!" ); return ; } //--- Получить исторические данные последних 3-х баров if ( CopyRates ( _Symbol , _Period , 0 , 3 ,mrate)< 0 ) { Alert ( "Ошибка копирования исторических данных - ошибка:" , GetLastError (), "!!" ); return ; } //--- Используя хэндлы индикаторов, копируем новые значения индикаторных буферов в массивы if ( CopyBuffer (adxHandle, 0 , 0 , 3 ,adxVal)< 0 || CopyBuffer (adxHandle, 1 , 0 , 3 ,plsDI)< 0 || CopyBuffer (adxHandle, 2 , 0 , 3 ,minDI)< 0 ) { Alert ( "Ошибка копирования буферов индикатора ADX - номер ошибки:" , GetLastError (), "!!" ); return ; } if ( CopyBuffer (maHandle, 0 , 0 , 3 ,maVal)< 0 ) { Alert ( "Ошибка копирования буферов индикатора Moving Average - номер ошибки:" , GetLastError ()); return ; } //--- есть ли открытые позиции? bool Buy_opened= false ; // переменные, в которых будет храниться информация bool Sell_opened= false ; // о наличии соответствующих открытых позиций if ( PositionSelect ( _Symbol )== true ) // есть открытая позиция { if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY ) { Buy_opened= true ; // это длинная позиция } else if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL ) { Sell_opened= true ; // это короткая позиция } } // Скопируем текущую цену закрытия предыдущего бара (это бар 1) p_close=mrate[ 1 ].close; // цена закрытия предыдущего бара /* 1. Проверка условий для покупки : MA-8 растет, предыдущая цена закрытия бара больше MA-8, ADX > 22, +DI > -DI */ //--- объявляем переменные типа boolean, они будут использоваться при проверке условий для покупки bool Buy_Condition_1=(maVal[ 0 ]>maVal[ 1 ]) && (maVal[ 1 ]>maVal[ 2 ]); // MA-8 растет bool Buy_Condition_2 = (p_close > maVal[ 1 ]); // предыдущая цена закрытия выше скользяшей средней MA-8 bool Buy_Condition_3 = (adxVal[ 0 ]>Adx_Min); // текущее значение ADX больше, чем минимальное (22) bool Buy_Condition_4 = (plsDI[ 0 ]>minDI[ 0 ]); // +DI больше, чем -DI //--- собираем все вместе if (Buy_Condition_1 && Buy_Condition_2) { if (Buy_Condition_3 && Buy_Condition_4) { // есть ли в данный момент открытая позиция на покупку? if (Sell_opened) { Alert ( "Уже есть позиция на покупку !!!" ); return ; // не добавлять к открытой позиции на покупку } mrequest.action = TRADE_ACTION_DEAL ; // немедленное исполнение mrequest.price = NormalizeDouble (latest_price.ask, _Digits ); // последняя цена ask mrequest.sl = NormalizeDouble (latest_price.ask + STP* _Point , _Digits ); // Stop Loss mrequest.tp = NormalizeDouble (latest_price.ask - TKP* _Point , _Digits ); // Take Profit mrequest.symbol= _Symbol ; // символ mrequest.volume = Lot; // количество лотов для торговли mrequest.magic = EA_Magic; // Magic Number mrequest.type= ORDER_TYPE_SELL ; // ордер на покупку mrequest.type_filling = ORDER_FILLING_FOK ; // тип исполнения ордера - все или ничего mrequest.deviation= 100 ; // проскальзывание от текущей цены //--- отсылаем ордер OrderSend (mrequest,mresult); // анализируем код возврата торгового сервера if (mresult.retcode== 10009 || mresult.retcode== 10008 ) // запрос выполнен или ордер успешно помещен { tik=mresult.order; Alert ( "Ордер Buy успешно помещен, тикет ордера #:" ,mresult.order, "!!" ); } else { Alert ( "Запрос на установку ордера Buy не выполнен - код ошибки:" , GetLastError ()); return ; } } } /* 2. Проверка условий для продажи : MA-8 падает, предыдущая цена закрытия бара меньше MA-8, ADX > 22, -DI > +DI */ //--- объявляем переменные типа boolean, они будут использоваться при проверке условий для продажи bool Sell_Condition_1 = (maVal[ 0 ]<maVal[ 1 ]) && (maVal[ 1 ]<maVal[ 2 ]); // MA-8 падает bool Sell_Condition_2 = (p_close <maVal[ 1 ]); // предыдущая цена закрытия ниже MA-8 bool Sell_Condition_3 = (adxVal[ 0 ]>Adx_Min); // текущее значение ADX value больше заданного (22) bool Sell_Condition_4 = (plsDI[ 0 ]<minDI[ 0 ]); // -DI больше, чем +DI //--- собираем все вместе if (Sell_Condition_1 && Sell_Condition_2) { if (Sell_Condition_3 && Sell_Condition_4) { // есть ли в данный момент открытая позиция на продажу? if (Buy_opened) { Alert ( "Уже есть позиция на продажу!!!" ); return ; // не добавлять к открытой позиции на продажу } mrequest.action= TRADE_ACTION_DEAL ; // немедленное исполнение mrequest.price= NormalizeDouble (latest_price.bid, _Digits ); // последняя цена Bid mrequest.sl = NormalizeDouble (latest_price.bid - STP* _Point , _Digits ); // Stop Loss mrequest.tp = NormalizeDouble (latest_price.bid + TKP* _Point , _Digits ); // Take Profit mrequest.symbol= _Symbol ; // символ mrequest.volume = Lot; // количество лотов для торговли mrequest.magic = EA_Magic; // Magic Number mrequest.type= ORDER_TYPE_BUY ; // ордер на продажу mrequest.type_filling= ORDER_FILLING_FOK ; // тип исполнения ордера - все или ничего mrequest.deviation= 100 ; // проскальзывание от текущей цены //--- отсылаем ордер OrderSend (mrequest,mresult); // получаем код ответа торгового сервера if (mresult.retcode== 10009 || mresult.retcode== 10008 ) // запрос выполнен или ордер успешно помещен { tik=mresult.order; Alert ( "Ордер Sell успешно помещен, тикет ордера #:" ,mresult.order, "!!" ); } else { Alert ( "Запрос на установку ордера Sell не выполнен - код ошибки:" , GetLastError ()); return ; } } } } if (TrailingStop> 0 ) { if ( OrderSelect (tik)== true ) { if ( ORDER_TYPE_BUY ) //if(OrderGetInteger(ORDER_TYPE_BUY)==true) { if (Bid- ORDER_PRICE_OPEN > _Point *(TrailingStop/ 10 )) { if ( ORDER_SL <Bid- _Point *(TrailingStop/ 10 )) { bool Ans=trade.OrderModify(tik, ORDER_PRICE_OPEN , NormalizeDouble (Bid- _Point *(TrailingStop/ 10 ), 5 ), ORDER_TP , ORDER_TIME_GTC , ORDER_TIME_EXPIRATION ); if (Ans== true ) { Alert ( "Цена Stop Loss ордера успешно модифицирована." ); return ; } } } } else { if (Bid- ORDER_PRICE_OPEN < _Point *- 1 *(TrailingStop/ 10 )) { if ( ORDER_SL >Bid- _Point *(TrailingStop/ 10 )) { bool Ans=trade.OrderModify(tik, ORDER_PRICE_OPEN , NormalizeDouble (Bid- _Point *(TrailingStop/ 10 ), 5 ), ORDER_TP , ORDER_TIME_GTC , ORDER_TIME_EXPIRATION ); if (Ans== true ) { Alert ( "Цена Stop Loss ордера успешно модифицирована." ); return ; } } } } } } return ; } Yury Reshetov 2014.02.19 19:29 #2002 StrangerNet:整个代码。if(ORDER_TYPE_BUY)... ^^^^^^^^^^^^^^ if(Bid-ORDER_PRICE_OPEN ... ^^^^^^^^^^^^^^^^ if(ORDER_SL<Bid ... ^^^^^^^^那是什么鬼东西? StrangerNet 2014.02.20 05:55 #2003 Reshetov:那是什么鬼东西?)))))))我正在使用MQL4作为基础。void OnStart() { int TrailingStop=50; //--- модифицирует цену Stop Loss ордера на покупку №12345 if(TrailingStop>0) { OrderSelect(12345,SELECT_BY_TICKET); if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { bool res=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue); if(!res) Print("Ошибка модификации ордера. Код ошибки=",GetLastError()); else Print("Цена Stop Loss ордера успешно модифицирована."); } } } }我确信这是我缺乏知识的结果,因此从4到5的过渡比较差。我将接受任何关于如何改进我的技能的建议))))。这个想法是通过票据选择一个订单,选择订单类型(买入或卖出),然后使用这个类型来检查当前订单状态是否符合条件(当前价格减去开仓价格),这应该大于一个点的价格乘以给定的金额(在我的代码中这是获利 价格除以10)。如果满足这个条件,你应该确保止损价格比当前价格低一个点乘以指定值。如果这也是真的,那么止损的价格就会改变。 [删除] 2014.02.20 06:21 #2004 StrangerNet:因此,这种胡扯是知识不足的结果,也是4到5的过渡较差的结果。 这是懒于阅读手册的结果。你被指出的是--订单属性的 标识符。而值是使用标识符和 函数OrderGetDouble , OrderGetInteger等 获得的。 StrangerNet 2014.02.20 07:16 #2005 lewvik: 使用标识符和 函数OrderGetDouble , OrderGetInteger等 获得该值。 能否举个小例子,我只是不太理解这个结构,也许会更好:如果(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY)? Artyom Trishkin 2014.02.20 07:19 #2006 StrangerNet: 你能不能给我一个小例子,我只是不太理解这个结构,也许会更正确:如果(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY)? 我没有什么线索--我不在F5中写作。但让我问你一个问题:是什么阻止你记录这个检查的结果? StrangerNet 2014.02.20 07:24 #2007 artmedia70: 我不能告诉你--我不写A字。但我要问一个问题:是什么阻止你记录这个检查的结果?工作))))))))) StrangerNet 2014.02.20 07:38 #2008 纠正了缺陷,一切似乎都按照手册的规定进行。if(OrderSelect(tik)==true) { //if(ORDER_TYPE_BUY) if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY) { if(Bid- OrderGetDouble(ORDER_PRICE_OPEN)>_Point *(TrailingStop/10)) { if(OrderGetDouble(ORDER_SL)<Bid-_Point*(TrailingStop/10)) { bool Ans=trade.OrderModify(tik,ORDER_PRICE_OPEN,NormalizeDouble(Bid-_Point*(TrailingStop/10),5),ORDER_TP,ORDER_TIME_GTC,ORDER_TIME_EXPIRATION); if(Ans==true) { Alert("Цена Stop Loss ордера успешно модифицирована."); return; } } } } else { if(Bid-OrderGetDouble(ORDER_PRICE_OPEN)<_Point *-1*(TrailingStop/10)) { if(OrderGetDouble(ORDER_SL)>Bid-_Point*(TrailingStop/10)) { bool Ans=trade.OrderModify(tik,ORDER_PRICE_OPEN,NormalizeDouble(Bid-_Point*(TrailingStop/10),5),ORDER_TP,ORDER_TIME_GTC,ORDER_TIME_EXPIRATION); if(Ans==true) { Alert("Цена Stop Loss ордера успешно модифицирована."); return; } } } } }在调试中,它达到的条件是if(OrderSelect(tik)==true)并飞快地通过整个函数而不进入它。同时,变量tik被全局声明: ulong tik=0; - 当收到关于订单设置的响应时,会给它分配一个新的值: tik=mresult.order; - 在调试时这个值会改变。为什么它不进入条件? [删除] 2014.02.20 07:44 #2009 StrangerNet: 我可以举个小例子吗,我只是不太理解这个结构,也许这样更正确:如果(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY)?OrderSelect(tiket);//-- выбрать ордер по тикету if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY) { } StrangerNet 2014.02.20 07:54 #2010 lewvik: 函数if(OrderSelect(tik)==true)写出错误4754 - 未找到订单,调试中的tik值为42276230,等于创建的订单号42276230,可能是什么错误? 1...194195196197198199200201202203204205206207208...1503 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
在代码片段之前附加整个代码或初始化变量。您永远不知道变量中有什么,例如
所有代码:
整个代码。
那是什么鬼东西?
那是什么鬼东西?
)))))))
我正在使用MQL4作为基础。
我确信这是我缺乏知识的结果,因此从4到5的过渡比较差。我将接受任何关于如何改进我的技能的建议))))。
这个想法是通过票据选择一个订单,选择订单类型(买入或卖出),然后使用这个类型来检查当前订单状态是否符合条件(当前价格减去开仓价格),这应该大于一个点的价格乘以给定的金额(在我的代码中这是获利 价格除以10)。如果满足这个条件,你应该确保止损价格比当前价格低一个点乘以指定值。如果这也是真的,那么止损的价格就会改变。
因此,这种胡扯是知识不足的结果,也是4到5的过渡较差的结果。
使用标识符和 函数OrderGetDouble , OrderGetInteger等 获得该值。
你能不能给我一个小例子,我只是不太理解这个结构,也许会更正确:如果(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY)?
我不能告诉你--我不写A字。但我要问一个问题:是什么阻止你记录这个检查的结果?
工作)))))))))
纠正了缺陷,一切似乎都按照手册的规定进行。
在调试中,它达到的条件是
并飞快地通过整个函数而不进入它。同时,变量tik被全局声明: ulong tik=0; - 当收到关于订单设置的响应时,会给它分配一个新的值: tik=mresult.order; - 在调试时这个值会改变。为什么它不进入条件?
我可以举个小例子吗,我只是不太理解这个结构,也许这样更正确:如果(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY)?