MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1585 1...157815791580158115821583158415851586158715881589159015911592...1953 새 코멘트 Tretyakov Rostyslav 2021.08.12 09:08 #15841 올바르게 쓰는 방법? "a" * "b" "x" 번, 즉 "x=3"인 경우 그런 다음 "a*b*b*b" Aleksei Stepanenko 2021.08.12 10:15 #15842 a*MathPow(b,x) Tretyakov Rostyslav 2021.08.12 10:39 #15843 Aleksei Stepanenko : 좋아요. 감사합니다. Valeriy Yastremskiy 2021.08.12 12:06 #15844 MakarFX : 감사합니다, 하지만 이것은 어떤 식으로든 내 코드를 단순화하지 않습니다) 따라서 2가지 조건, 즉 모듈, 차이 및 1가지 조건 대신 범위의 중간을 계산하려고 합니다. законопослушный гражданин 2021.08.12 17:02 #15845 MakarFX : 정말 감사합니다! 연결된 것처럼 더 이상 오류는 없지만 여전히 작동하지 않습니다. 거래를 열지 않습니다. 코드 부분 사이에 연결이 없는 부분이 이해되지 않습니다. 무엇을 잘못했는지 봐주세요. //+-----------------------------------------------------------------------------------------------+ //| Simple Moving Average.mq4 | //| Copyright 2016, Andrey Minaev | //| https://www.mql5.com/ru/users/id.scorpion | //+-----------------------------------------------------------------------------------------------+ #property copyright "Copyright 2016, Andrey Minaev" #property link " https://www.mql5.com/ru/users/id.scorpion " #property version "1.00" #property strict // Параметры советника extern string sParametersEA = "" ; // Параметры советника extern double dLots = 0.01 ; // Количество лотов extern int iStopLoss = 30 ; // Уровень убытка (в пунктах) extern int iTakeProfit = 30 ; // Уровень прибыли (в пунктах) extern int iSlippage = 3 ; // Проскальзование (в пунктах) extern int iMagic = 1 ; // Индентификатор советника extern double K_Martin = 2.0 ; // Умножает лот после SL. пока не получим TP extern int OrdersClose = 5 ; extern int DigitsLot = 2 ; // Параметры индикатора extern string sParametersMA = "" ; // Параметры индикатора extern int iPeriodMA = 14 ; // Период усреднения // Глобальные переменные double dMA; double MINLOT,MAXLOT,MaxMartinLot; //+-----------------------------------------------------------------------------------------------+ int OnInit () { // Если брокер использует 3 или 5 знаков после запятой, то умножаем на 10 if ( Digits == 3 || Digits == 5 ) { iStopLoss *= 10 ; iTakeProfit *= 10 ; iSlippage *= 10 ; } return ( INIT_SUCCEEDED ); } //+-----------------------------------------------------------------------------------------------+ void OnDeinit ( const int reason) { } //+-----------------------------------------------------------------------------------------------+ void OnTick () { // Получим значение индикатора dMA = iMA ( Symbol (), 0 , iPeriodMA, 0 , MODE_SMA , PRICE_CLOSE , 0 ); // Если нет открытых ордеров, то входим в условие if (bCheckOrders() == true ) { // Если появился сигнал на покупку, то откроем ордер на покупку if (bSignalBuy() == true ) vOrderOpenBuy(); // Если появился сигнал на продажу, то откроем ордер на продажу if (bSignalSell() == true ) vOrderOpenSell(); } } //+-----------------------------------------------------------------------------------------------+ //| Функция проверки открытых оредров | //+-----------------------------------------------------------------------------------------------+ bool bCheckOrders() { // Переберем в цикле ордера, для проверки открытых ордеров данным советником for ( int i = 0 ; i <= OrdersTotal (); i++) if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol() == Symbol () && OrderMagicNumber() == iMagic) return ( false ); return ( true ); } //+-----------------------------------------------------------------------------------------------+ //| Функция поиска сигнала на покупку | //+-----------------------------------------------------------------------------------------------+ bool bSignalBuy() { if (dMA > Open[ 1 ] && dMA < Close[ 1 ]) return ( true ); return ( false ); } //+-----------------------------------------------------------------------------------------------+ //| Функция поиска сигнала на продажу | //+-----------------------------------------------------------------------------------------------+ bool bSignalSell() { if (dMA < Open[ 1 ] && dMA > Close[ 1 ]) return ( true ); return ( false ); } //+-----------------------------------------------------------------------------------------------+ //| Функция открытия ордера на покупку | //+-----------------------------------------------------------------------------------------------+ void vOrderOpenBuy() { int iOTi = 0 ; // Тикет ордера iOTi = OrderSend ( Symbol (), OP_BUY, Lots(), Ask, iSlippage, 0 , 0 , "" , iMagic, 0 , clrNONE ); // Проверим открылся ли ордер if (iOTi > 0 ) // Есди да, то выставим уровни убытка и прибыли vOrderModify(iOTi); else // Если нет, то получим ошибку vError( GetLastError ()); } //+-----------------------------------------------------------------------------------------------+ //| Функция открытия ордера на продажу | //+-----------------------------------------------------------------------------------------------+ void vOrderOpenSell() { int iOTi = 0 ; // Тикет ордера iOTi = OrderSend ( Symbol (), OP_SELL, Lots(), Bid, iSlippage, 0 , 0 , "" , iMagic, 0 , clrNONE ); // Проверим открылся ли ордер if (iOTi > 0 ) // Есди да, то выставим уровни убытка и прибыли vOrderModify(iOTi); else // Если нет, то получим ошибку vError( GetLastError ()); } //+-----------------------------------------------------------------------------------------------+ //| Функция модификации ордера | //+-----------------------------------------------------------------------------------------------+ void vOrderModify( int iOTi) { int iOTy = - 1 ; // Тип ордера double dOOP = 0 ; // Цена открытия ордера double dOSL = 0 ; // Стоп Лосс int iMag = 0 ; // Идентификатор советника double dSL = 0 ; // Уровень убытка double dTP = 0 ; // Уровень прибыли // Выберем по тикету открытый ордер, получим некоторые значения if ( OrderSelect (iOTi, SELECT_BY_TICKET, MODE_TRADES)) { iOTy = OrderType(); dOOP = OrderOpenPrice(); dOSL = OrderStopLoss(); iMag = OrderMagicNumber(); } // Если ордер открыл данный советник, то входим в условие if (OrderSymbol() == Symbol () && OrderMagicNumber() == iMag) { // Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордер if (dOSL == 0 ) { if (iOTy == OP_BUY) { dSL = NormalizeDouble (dOOP - iStopLoss * Point , Digits ); dTP = NormalizeDouble (dOOP + iTakeProfit * Point , Digits ); bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0 , clrNONE ); } if (iOTy == OP_SELL) { dSL = NormalizeDouble (dOOP + iStopLoss * Point , Digits ); dTP = NormalizeDouble (dOOP - iTakeProfit * Point , Digits ); bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0 , clrNONE ); } } } } //+-----------------------------------------------------------------------------------------------+ //| Функция обработки ошибок | //+-----------------------------------------------------------------------------------------------+ void vError( int iErr) { switch (iErr) { case 129 : // Неправильная цена case 135 : // Цена изменилась case 136 : // Нет цен case 138 : // Новые цены Sleep ( 1000 ); RefreshRates(); break ; case 137 : // Брокер занят case 146 : // Подсистема торговли занята Sleep ( 3000 ); RefreshRates(); break ; } } //+-----------------------------------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Расчет лота | //+------------------------------------------------------------------+ double Lots() { double L= 0 ; // если последняя закрытая сделка убыточная и лот равен стартовому // включаем Мартин if (GetInfoLastPos( 2 )< 0 &&GetInfoLastPos( 1 )==dLots) { K_Martin= true ; } // если последняя закрытая сделка убыточная и лот больше или равен максимальному // выключаем Мартин if (GetInfoLastPos( 2 )< 0 &&GetInfoLastPos( 1 )>=MaxMartinLot) { K_Martin= false ; } // если последняя закрытая сделка убыточная и Мартин включен, умножаем лот if (K_Martin== true ) { L= NormalizeDouble (GetInfoLastPos( 1 )*K_Martin,DigitsLot); } // если последняя закрытая сделка убыточная и Мартин выключен, делим лот if (K_Martin== false ) { L= NormalizeDouble (GetInfoLastPos( 1 )/K_Martin,DigitsLot); } if (L>MAXLOT) L = MAXLOT; if (L<MINLOT) L = MINLOT; return (L); } //+----------------------------------------------------------------------------+ //| Функция возвращает по символу и магику | //| 1 - размер лота последней закрытой позиции | //| 2 - размер профита с учетом комиссии и свопа последней закрытой позиции | //| 3 - время последней закрытой позиции | //+----------------------------------------------------------------------------+ double GetInfoLastPos( int a= 1 ) { datetime t= 0 ; double result= 0 ,l= 0 ,p= 0 ,f= 0 ; int i=OrdersHistoryTotal(); for ( int pos= 0 ; pos<i; pos++) { if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()== _Symbol && OrderMagicNumber()==iMagic) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (t<OrderCloseTime()) {t=OrderCloseTime(); l=OrderLots(); p=OrderProfit()+OrderCommission()+OrderSwap();} } } } } if (a== 1 ) {result=l;} else if (a== 2 ) {result=p;} else if (a== 3 ) {result=( double )t;} else {result= 0 ;} return (result); } //+------------------------------------------------------------------+ Tretyakov Rostyslav 2021.08.12 17:14 #15846 законопослушный гражданин : 정말 감사합니다! 연결된 것처럼 더 이상 오류는 없지만 여전히 작동하지 않습니다. 거래를 열지 않습니다. 코드 부분 사이에 연결이 없는 부분이 이해되지 않습니다. 봐주세요, 뭘 잘못했어요? 잘못된 //+------------------------------------------------------------------+ //| Расчет лота | //+------------------------------------------------------------------+ double Lots() { double L= 0 ; // если последняя закрытая сделка убыточная и лот равен стартовому // включаем Мартин if (GetInfoLastPos( 2 )< 0 &&GetInfoLastPos( 1 )==dLots) { K_Martin = true ; } // если последняя закрытая сделка убыточная и лот больше или равен максимальному // выключаем Мартин if (GetInfoLastPos( 2 )< 0 &&GetInfoLastPos( 1 )>= MaxMartinLot ) { K_Martin = false ; } // если последняя закрытая сделка убыточная и Мартин включен, умножаем лот if ( K_Martin == true ) { L= NormalizeDouble (GetInfoLastPos( 1 )*K_Martin,DigitsLot); } // если последняя закрытая сделка убыточная и Мартин выключен, делим лот if ( K_Martin == false ) { L= NormalizeDouble (GetInfoLastPos( 1 )/K_Martin,DigitsLot); } if (L>MAXLOT) L = MAXLOT; if (L<MINLOT) L = MINLOT; return (L); } Tretyakov Rostyslav 2021.08.12 17:24 #15847 законопослушный гражданин : 정말 감사합니다! 연결된 것처럼 더 이상 오류는 없지만 여전히 작동하지 않습니다. 거래를 열지 않습니다. 코드 부분 사이에 연결이 없는 부분이 이해되지 않습니다. 무엇을 잘못했는지 봐주세요. 내가 준 "Lot Calculation"기능을 설정하십시오 (변경 없음) 강조 표시 추가 // Глобальные переменные double dMA; double MINLOT,MAXLOT; double MaxMartinLot; bool Martin= false ; //+-----------------------------------------------------------------------------------------------+ int OnInit () { MaxMartinLot=Lot* MathPow (K_Martin, 3 ); // Если брокер использует 3 или 5 знаков после запятой, то умножаем на 10 if ( Digits == 3 || Digits == 5 ) { iStopLoss *= 10 ; iTakeProfit *= 10 ; iSlippage *= 10 ; } return ( INIT_SUCCEEDED ); } законопослушный гражданин 2021.08.12 17:34 #15848 MakarFX : 잘못된 감사하다. 그대로 돌아왔습니다. 세 가지 오류가 발생합니다. 'Martin' - 선언되지 않은 식별자 다른 전역 변수 를 설정해야 합니까? double Lots() { double L= 0 ; // если последняя закрытая сделка убыточная и лот равен стартовому // включаем Мартин if (GetInfoLastPos( 2 )< 0 &&GetInfoLastPos( 1 )==dLots) { Martin= true ; } // если последняя закрытая сделка убыточная и лот больше или равен максимальному // выключаем Мартин if (GetInfoLastPos( 2 )< 0 &&GetInfoLastPos( 1 )>=MaxMartinLot) { Martin= false ; } // если последняя закрытая сделка убыточная и Мартин включен, умножаем лот if (Martin== true ) { L= NormalizeDouble (GetInfoLastPos( 1 )*K_Martin,DigitsLot); } // если последняя закрытая сделка убыточная и Мартин выключен, делим лот if (Martin== false ) { L= NormalizeDouble (GetInfoLastPos( 1 )/K_Martin,DigitsLot); } if (L>MAXLOT) L = MAXLOT; if (L<MINLOT) L = MINLOT; return (L); } Tretyakov Rostyslav 2021.08.12 17:38 #15849 законопослушный гражданин : 감사하다. 그대로 돌아왔습니다. 세 가지 오류가 발생합니다. 'Martin' - 선언되지 않은 식별자 다른 전역 변수 를 설정해야 합니까? 여기 законопослушный гражданин 2021.08.12 17:47 #15850 MakarFX : 내가 준 "Lot Calculation"기능을 설정하십시오 (변경 없음) 강조 표시 추가 만들어진. 이제 'Lot'는 선언되지 않은 식별자입니다. 나는 필요합니다: extern double dLots = 0.01; 다음으로 대체: extern double Lot = 0.01; ? 오 아니 ... 그것도 작동하지 않는 것 같습니다. 1...157815791580158115821583158415851586158715881589159015911592...1953 새 코멘트 트레이딩 기회를 놓치고 있어요: 무료 트레이딩 앱 복사용 8,000 이상의 시그널 금융 시장 개척을 위한 경제 뉴스 등록 로그인 공백없는 라틴 문자 비밀번호가 이 이메일로 전송될 것입니다 오류 발생됨 Google으로 로그인 웹사이트 정책 및 이용약관에 동의합니다. 계정이 없으시면, 가입하십시오 MQL5.com 웹사이트에 로그인을 하기 위해 쿠키를 허용하십시오. 브라우저에서 필요한 설정을 활성화하시지 않으면, 로그인할 수 없습니다. 사용자명/비밀번호를 잊으셨습니까? Google으로 로그인
올바르게 쓰는 방법?
"a" * "b" "x" 번, 즉
"x=3"인 경우
그런 다음 "a*b*b*b"
a*MathPow(b,x)
감사합니다, 하지만 이것은 어떤 식으로든 내 코드를 단순화하지 않습니다)
따라서 2가지 조건, 즉 모듈, 차이 및 1가지 조건 대신 범위의 중간을 계산하려고 합니다.
정말 감사합니다!
연결된 것처럼 더 이상 오류는 없지만 여전히 작동하지 않습니다. 거래를 열지 않습니다. 코드 부분 사이에 연결이 없는 부분이 이해되지 않습니다.
무엇을 잘못했는지 봐주세요.
정말 감사합니다!
연결된 것처럼 더 이상 오류는 없지만 여전히 작동하지 않습니다. 거래를 열지 않습니다. 코드 부분 사이에 연결이 없는 부분이 이해되지 않습니다.
봐주세요, 뭘 잘못했어요?
잘못된
정말 감사합니다!
연결된 것처럼 더 이상 오류는 없지만 여전히 작동하지 않습니다. 거래를 열지 않습니다. 코드 부분 사이에 연결이 없는 부분이 이해되지 않습니다.
무엇을 잘못했는지 봐주세요.
내가 준 "Lot Calculation"기능을 설정하십시오 (변경 없음)
강조 표시 추가
잘못된
감사하다.
그대로 돌아왔습니다. 세 가지 오류가 발생합니다. 'Martin' - 선언되지 않은 식별자
다른 전역 변수 를 설정해야 합니까?
감사하다.
그대로 돌아왔습니다. 세 가지 오류가 발생합니다. 'Martin' - 선언되지 않은 식별자
다른 전역 변수 를 설정해야 합니까?
여기
내가 준 "Lot Calculation"기능을 설정하십시오 (변경 없음)
강조 표시 추가
만들어진.
이제 'Lot'는 선언되지 않은 식별자입니다.
나는 필요합니다: extern double dLots = 0.01; 다음으로 대체: extern double Lot = 0.01; ?
오 아니 ... 그것도 작동하지 않는 것 같습니다.