MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1654 1...164716481649165016511652165316541655165616571658165916601661...1953 새 코멘트 Volodymyr Zubov 2021.10.08 19:29 #16531 MakarFX # : 다른 옵션을 알고 있다면 다음을 작성하십시오 ... 사람들을 도우십시오) init에서 모든 변수를 별도로 만들고 추가 처리를 위해 분리합니다(게으를 필요가 없음) 또한 대괄호로 블록을 할당하고 반환 변수를 비교합니다. Tretyakov Rostyslav 2021.10.08 19:37 #16532 Volodymyr Zubov # : init에서 모든 변수를 별도로 만들고 추가 처리를 위해 분리합니다 (게으를 필요가 없음) 또한 대괄호로 블록을 할당하고 반환 변수를 비교합니다. 어떻게하는지 보여줘. Volodymyr Zubov 2021.10.08 19:50 #16533 어딘가에 그렇게... 올빼미 전체를 배치하고 싶었지만 포럼에서는 제공하지 않습니다. 어떤 조각이 필요합니까? Tretyakov Rostyslav 2021.10.08 19:53 #16534 Volodymyr Zubov # : 어딘데 그렇게... 어떤 조각이 필요합니까? 찰로... Volodymyr Zubov 2021.10.08 20:01 #16535 알아요) Igor Makanu 2021.10.08 20:25 #16536 거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼 MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 MakarFX , 2021.10.08 18:43 //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick () { //--- if (CheckForOpen()== 0 ) { if ( OrderSend ( Symbol (),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss* Point ,Ask+TakeProfit* Point , "" ,MagicNumber, 0 ,Blue)) Print ( "BUY OK" ); } if (CheckForOpen()== 1 ) { if ( OrderSend ( Symbol (),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss* Point ,Bid-TakeProfit* Point , "" ,MagicNumber, 0 ,Red)) Print ( "SELL OK" ); } } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ int CheckForOpen() // Открытие ордера по методу Пуриа { double malw,mas1,mas2,macd; int res=- 1 , buy= 0 , sell= 0 ; // Считывание параметров индикаторов 3 свечи malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 3 ); mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 3 ); mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 3 ); macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 3 ); if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;} if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;} // Считывание параметров индикаторов 2 свечи malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 2 ); mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 2 ); mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 2 ); macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 2 ); if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;} if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;} // Считывание параметров индикаторов 1 свечи malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 1 ); mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 1 ); mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 1 ); macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 1 ); if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;} if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;} // Считывание параметров индикаторов 0 свечи malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 0 ); mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 0 ); mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 0 ); macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 0 ); if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;} if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;} if (buy == 4 ) res= 0 ; if (sell== 4 ) res= 1 ; return (res); } 함수에서 동일한 표시기 호출을 래핑하는 것이 필요했다고 생각합니다. 코드가 더 간결해질 것이며, 이제 4개 막대에서 표시기 값을 사용하고 내일 5개에서 표시기 값을 사용합니다... 저것들. int SignalByPuria( const int bar) { malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE ,bar); mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW ,bar); mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW ,bar); ...... } 때때로 지정된 막대에 거래 신호가 없는 지표가 있습니다. 저는 일반적으로 열거형을 사용합니다. enum E_CMD{CMD_BUY,CMD_SELL,CMD_NONE}; 그러면 "signal" 함수의 서명은 E_CMD SignalByPuria(const int bar) 가 됩니다. 음, EA 코드 자체는 다음과 같이 바뀝니다. E_CMD Signal_ind_1( const int bar) { .... } E_CMD Signal_ind_2( const int bar) { .... } E_CMD Signal_ind_2( const int bar) { .... } void OnTick () { ..... if (Signal_ind_1 = =CMD_BUY && Signal_ind_2 == CMD_BUY && Signal_ind_3 == CMD_BUY) // открываем ордер на покупку else if (Signal_ind_1 = =CMD_SELL && Signal_ind_2 == CMD_SELL && Signal_ind_3 == CMD_SELL) // открываем ордер на продажу .... } IMHO, 이 접근 방식을 사용하면 이미 작성된 EA 코드에 새로운 거래 신호를 빠르게 추가할 수 있습니다. Tretyakov Rostyslav 2021.10.08 20:41 #16537 Igor Makanu # : 함수에서 동일한 표시기 호출을 래핑하는 것이 필요했다고 생각합니다. 코드가 더 간결해질 것이며, 이제 4개 막대에서 표시기 값을 사용하고 내일 5개에서 표시기 값을 사용합니다... 저것들. 때때로 지정된 막대에 거래 신호가 없는 지표가 있습니다. 저는 일반적으로 열거형을 사용합니다. enum E_CMD{CMD_BUY,CMD_SELL,CMD_NONE}; 그러면 "signal" 함수의 서명은 E_CMD SignalByPuria(const int bar) 가 됩니다. 음, EA 코드 자체는 다음과 같이 바뀝니다. IMHO, 이 접근 방식을 사용하면 이미 작성된 EA 코드에 새로운 거래 신호를 빠르게 추가할 수 있습니다. 감사합니다 Igor, 서비스에 사용할 것입니다) Volodymyr Zubov 2021.10.08 21:48 #16538 대화로 돌아가서 MT4의 마켓 오픈 포지션 기능이 있습니다. //+------------------------------------------------------------------+ //| Zero_Level.mq4 | //| Copyright © 2007, Xupypr | //+------------------------------------------------------------------+ // Функция вычисляющая уровни безубытка, на покупку, на продажу с учетом накопленных свопов. double Zero_Level( string sy, int mn) { double ZeroLevel= 0 ; double BuyLots= 0 ; double SellLots= 0 ; double BuyProfit= 0 ; double SellProfit= 0 ; double SellLevel; double BuyLevel; int Total= OrdersTotal (); for ( int i=Total- 1 ; i>= 0 ; i--) { if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) { if (OrderSymbol()!=sy) continue ; if (OrderMagicNumber() != mn) continue ; if (OrderType()==OP_BUY) { BuyLots=BuyLots+OrderLots(); BuyProfit=BuyProfit+OrderProfit()+OrderCommission()+OrderSwap(); } if (OrderType()==OP_SELL) { SellLots=SellLots+OrderLots(); SellProfit=SellProfit+OrderProfit()+OrderCommission()+OrderSwap(); } } } double TickValue=MarketInfo(sy,MODE_TICKVALUE); if (BuyLots> 0 ) BuyLevel= NormalizeDouble (MarketInfo(sy,MODE_BID)-(BuyProfit/(TickValue*BuyLots)*MarketInfo(sy,MODE_POINT)),( int )MarketInfo(sy,MODE_DIGITS)); else BuyLevel= 0 ; if (SellLots> 0 ) SellLevel= NormalizeDouble (MarketInfo(sy,MODE_ASK)+(SellProfit/(TickValue*SellLots)*MarketInfo(sy,MODE_POINT)),( int )MarketInfo(sy,MODE_DIGITS)); else SellLevel= 0 ; if (BuyLevel> 0 ) ZeroLevel=BuyLevel; if (SellLevel> 0 ) ZeroLevel=SellLevel; return NormalizeDouble (ZeroLevel, _Digits ); //Нормализовали полученную цену } //--- End --- //+---------------------------------------------------------------------------+ //| Функция открытия рыночной позиции (c) Boshetunmay 2021 | //+---------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента | //| op - операция | //| ll - лот | //| slipp - проскальзывание | //| sl - уровень стоп | //| tp - уровень тейк | //| comment - коментарий | //| mn - MagicNumber | //| cl - цвет значка открытия | //+---------------------------------------------------------------------------+ // OpenPosition(string symbol,int operation,double volume,int slippage,int stoploss,int takeprofit,string comment,int magic,color); int OpenPosition( string sy, int op, double ll, int slipp, int sl, int tp, string comment, int mn, color cl) { if (op == OP_BUY) // открытие BUY { // проверяем доступность свободных средств if ((AccountFreeMarginCheck(sy,OP_BUY,ll)<= 0 ) || ( GetLastError ()== 134 )) { Print (sy, " " ,ll, " It is impossible to open the order Buy, not enough money." ); return ( 0 ); } RefreshRates(); // открываем ордер OP_BUY int ticketbuy = OrderSend (sy,OP_BUY,ll,MarketInfo(sy,MODE_ASK),slipp, 0 , 0 ,comment,mn, 0 ,cl); if (ticketbuy< 0 ) Print (sy, " OpenPosition. OrderSend Buy fail #" , GetLastError ()); else Print (sy, " OpenPosition. OrderSend Buy successfully" ); Sleep ( 1000 ); // модифицируем ордер (выставляем тейпрофит и стоплосс) if (sl != 0 || tp != 0 ) { //--- получим минимальное значение Stop level double minstoplevel=MarketInfo(sy,MODE_STOPLEVEL); Print ( "Minimum Stop Level=" ,minstoplevel, " points" ); //--- вычисленные значения цен SL и TP должны быть нормализованы double BSLoss = NormalizeDouble (Zero_Level( _Symbol ,mn)-(sl+minstoplevel)*MarketInfo(sy,MODE_POINT),( int )MarketInfo(sy,MODE_DIGITS)); double BTProfit = NormalizeDouble (Zero_Level( _Symbol ,mn)+(tp+minstoplevel)*MarketInfo(sy,MODE_POINT),( int )MarketInfo(sy,MODE_DIGITS)); //--- если входящие значения ноль то заменяем цену модификации на ноль if (sl == 0 ) BSLoss = 0 ; if (tp == 0 ) BTProfit = 0 ; bool resbuy = OrderModify(ticketbuy,OrderOpenPrice(),BSLoss,BTProfit, 0 , clrNONE ); if (!resbuy) Print (sy, " OpenPosition. OrderModify Buy fail #" , GetLastError ()); else Print (sy, " OpenPosition. OrderModify Buy successfully" ); } } if (op == OP_SELL) // открытие Sell { // проверяем доступность свободных средств if ((AccountFreeMarginCheck(sy,OP_SELL,ll)<= 0 ) || ( GetLastError ()== 134 )) { Print (sy, " " ,ll, " It is impossible to open the order Sell, not enough money." ); return ( 0 ); } RefreshRates(); // открываем ордер OP_SELL int ticketsell = OrderSend (sy,OP_SELL,ll,MarketInfo(sy,MODE_BID),slipp, 0 , 0 ,comment,mn, 0 ,cl); if (ticketsell< 0 ) Print (sy, " OpenPosition. OrderSend Sell fail #" , GetLastError ()); else Print (sy, " OpenPosition. OrderSend Sell successfully" ); Sleep ( 1000 ); // модифицируем ордер (выставляем тейпрофит и стоплосс) if (sl != 0 || tp != 0 ) { //--- получим минимальное значение Stop level double minstoplevel=MarketInfo(sy,MODE_STOPLEVEL); Print ( "Minimum Stop Level=" ,minstoplevel, " points" ); //--- вычисленные значения цен SL и TP должны быть нормализованы double SSLoss = NormalizeDouble (Zero_Level( _Symbol ,mn)+(sl+minstoplevel)*MarketInfo(sy,MODE_POINT),( int )MarketInfo(sy,MODE_DIGITS)); double STProfit = NormalizeDouble (Zero_Level( _Symbol ,mn)-(tp+minstoplevel)*MarketInfo(sy,MODE_POINT),( int )MarketInfo(sy,MODE_DIGITS)); //--- если входящие значения ноль то заменяем цену модификации на ноль if (sl == 0 ) SSLoss = 0 ; if (tp == 0 ) STProfit = 0 ; bool ressell = OrderModify(ticketsell,OrderOpenPrice(),SSLoss,STProfit, 0 , clrNONE ); if (!ressell) Print (sy, " OpenPosition. OrderModify Sell fail #" , GetLastError ()); else Print (sy, " OpenPosition. OrderModify Sell successfully" ); } } return ( 1 ); } //--- End --- 오늘 무역 플래그를 반환합니다. //+----------------------------------------------------------------------------+ //| Описание : Возвращает флаг торгов сегодня. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int isTradeToDay( string sy= "" , int op=- 1 , int mn=- 1 ) { int i, k=OrdersHistoryTotal(); if (sy== "0" ) sy= _Symbol ; for (i= 0 ; i<k; i++) { if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()==sy || sy== "" ) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op< 0 || OrderType()==op) { if (mn< 0 || OrderMagicNumber()==mn) { if (TimeDay(OrderOpenTime())==Day() && TimeMonth(OrderOpenTime())==Month() && TimeYear(OrderOpenTime())==Year()) return ( 1 ); } } } } } } k= OrdersTotal (); for (i= 0 ; i<k; i++) { if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy== "" ) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op< 0 || OrderType()==op) { if (mn< 0 || OrderMagicNumber()==mn) { if (TimeDay(OrderOpenTime())==Day() && TimeMonth(OrderOpenTime())==Month() && TimeYear(OrderOpenTime())==Year()) return ( 1 ); } } } } } } return ( 0 ); } //--- End --- 위치 수를 반환합니다. //+----------------------------------------------------------------------------+ //| Описание : Возвращает количество позиций. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfPositions( string sy= "" , int op=- 1 , int mn=- 1 ) { int i, k= OrdersTotal (), kp= 0 ; if (sy== "0" ) sy= _Symbol ; for (i= 0 ; i<k; i++) { if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy== "" ) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op< 0 || OrderType()==op) { if (mn< 0 || OrderMagicNumber()==mn) kp++; } } } } } return (kp); } //--- End --- 현재 모든 것이 터미널 빌드에 최적화되어 있습니다. Tretyakov Rostyslav 2021.10.08 22:22 #16539 Volodymyr Zubov 위치 수를 반환합니다. 현재 모든 것이 터미널 빌드에 최적화되어 있습니다. 왜 손가락이 있는지 이해하지 못합니까? Volodymyr Zubov 2021.10.08 22:30 #16540 MakarFX # : 왜 여기에 손가락이 있는지 이해하지 못합니까? 여기에서 OrderSend를 밀어 넣는 것만으로는 가치가 없다는 점을 지적하고 두려워하는 것은 좋지 않습니다. 적절하게 사면과 슈카티를 받으십시오. 1...164716481649165016511652165316541655165616571658165916601661...1953 새 코멘트 트레이딩 기회를 놓치고 있어요: 무료 트레이딩 앱 복사용 8,000 이상의 시그널 금융 시장 개척을 위한 경제 뉴스 등록 로그인 공백없는 라틴 문자 비밀번호가 이 이메일로 전송될 것입니다 오류 발생됨 Google으로 로그인 웹사이트 정책 및 이용약관에 동의합니다. 계정이 없으시면, 가입하십시오 MQL5.com 웹사이트에 로그인을 하기 위해 쿠키를 허용하십시오. 브라우저에서 필요한 설정을 활성화하시지 않으면, 로그인할 수 없습니다. 사용자명/비밀번호를 잊으셨습니까? Google으로 로그인
다른 옵션을 알고 있다면 다음을 작성하십시오 ...
사람들을 도우십시오)
init에서 모든 변수를 별도로 만들고 추가 처리를 위해 분리합니다(게으를 필요가 없음)
또한 대괄호로 블록을 할당하고 반환 변수를 비교합니다.
init에서 모든 변수를 별도로 만들고 추가 처리를 위해 분리합니다 (게으를 필요가 없음)
또한 대괄호로 블록을 할당하고 반환 변수를 비교합니다.
어딘가에 그렇게...
올빼미 전체를 배치하고 싶었지만 포럼에서는 제공하지 않습니다.
어떤 조각이 필요합니까?
어딘데 그렇게...
어떤 조각이 필요합니까?
거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼
MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론
MakarFX , 2021.10.08 18:43
함수에서 동일한 표시기 호출을 래핑하는 것이 필요했다고 생각합니다. 코드가 더 간결해질 것이며, 이제 4개 막대에서 표시기 값을 사용하고 내일 5개에서 표시기 값을 사용합니다...
저것들.
때때로 지정된 막대에 거래 신호가 없는 지표가 있습니다. 저는 일반적으로 열거형을 사용합니다. enum E_CMD{CMD_BUY,CMD_SELL,CMD_NONE};
그러면 "signal" 함수의 서명은 E_CMD SignalByPuria(const int bar) 가 됩니다. 음, EA 코드 자체는 다음과 같이 바뀝니다.
IMHO, 이 접근 방식을 사용하면 이미 작성된 EA 코드에 새로운 거래 신호를 빠르게 추가할 수 있습니다.
함수에서 동일한 표시기 호출을 래핑하는 것이 필요했다고 생각합니다. 코드가 더 간결해질 것이며, 이제 4개 막대에서 표시기 값을 사용하고 내일 5개에서 표시기 값을 사용합니다...
저것들.
때때로 지정된 막대에 거래 신호가 없는 지표가 있습니다. 저는 일반적으로 열거형을 사용합니다. enum E_CMD{CMD_BUY,CMD_SELL,CMD_NONE};
그러면 "signal" 함수의 서명은 E_CMD SignalByPuria(const int bar) 가 됩니다. 음, EA 코드 자체는 다음과 같이 바뀝니다.
IMHO, 이 접근 방식을 사용하면 이미 작성된 EA 코드에 새로운 거래 신호를 빠르게 추가할 수 있습니다.
대화로 돌아가서 MT4의 마켓 오픈 포지션 기능이 있습니다.
오늘 무역 플래그를 반환합니다.
위치 수를 반환합니다.
현재 모든 것이 터미널 빌드에 최적화되어 있습니다.
현재 모든 것이 터미널 빌드에 최적화되어 있습니다.
왜 여기에 손가락이 있는지 이해하지 못합니까?
여기에서 OrderSend를 밀어 넣는 것만으로는 가치가 없다는 점을 지적하고 두려워하는 것은 좋지 않습니다. 적절하게 사면과 슈카티를 받으십시오.