MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1585 1...157815791580158115821583158415851586158715881589159015911592...1953 Yeni yorum Tretyakov Rostyslav 2021.08.12 11:08 #15841 nasıl doğru yazılır? "a" * "b" "x" kez, yani. "x=3" ise sonra "a*b*b*b" [Silindi] 2021.08.12 12:15 #15842 a*MathPow(b,x) Tretyakov Rostyslav 2021.08.12 12:39 #15843 Aleksei Stepanenko : Harika teşekkür ederim. Valeriy Yastremskiy 2021.08.12 14:06 #15844 MakarFX : Teşekkürler, ancak bu kodumu hiçbir şekilde basitleştirmiyor) Bu nedenle, 2 koşul, modül, fark ve bir koşul yerine aralığın ortasını hesaplamaya çalışıyorum. законопослушный гражданин 2021.08.12 19:02 #15845 MakarFX : Çok teşekkürler! bağlı gibi, artık hata yok, ancak yine de çalışmıyor. Herhangi bir anlaşma açmıyor, kodun bölümleri arasında bağlantı olmadığını anlamıyorum: lütfen bak, neyi yanlış yaptın? //+-----------------------------------------------------------------------------------------------+ //| 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 19:14 #15846 законопослушный гражданин : Çok teşekkürler! bağlı gibi, artık hata yok, ancak yine de çalışmıyor. Herhangi bir anlaşma açmıyor, kodun bölümleri arasında bağlantı olmadığını anlamıyorum: Lütfen bakın neyi yanlış yaptınız? yanlış //+------------------------------------------------------------------+ //| Расчет лота | //+------------------------------------------------------------------+ 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 19:24 #15847 законопослушный гражданин : Çok teşekkürler! bağlı gibi, artık hata yok, ancak yine de çalışmıyor. Herhangi bir anlaşma açmıyor, kodun bölümleri arasında bağlantı olmadığını anlamıyorum: lütfen bak, neyi yanlış yaptın? "Lot Hesaplama" fonksiyonunu verdiğim gibi ayarlayın (değişiklik yok) ve vurgulananları ekleyin // Глобальные переменные 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 19:34 #15848 MakarFX : yanlış teşekkür etmek. olduğu gibi döndü. Üç hata veriyor: 'Martin' - bildirilmemiş tanımlayıcı başka bir global değişken ayarlamam gerekir mi? 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 19:38 #15849 законопослушный гражданин : teşekkür etmek. olduğu gibi döndü. Üç hata veriyor: 'Martin' - bildirilmemiş tanımlayıcı başka bir global değişken ayarlamam gerekir mi? Burada законопослушный гражданин 2021.08.12 19:47 #15850 MakarFX : "Lot Hesaplama" fonksiyonunu verdiğim gibi ayarlayın (değişiklik yok) ve vurgulananları ekleyin yapılmış. şimdi 'Lot' bildirilmemiş tanımlayıcıdır ihtiyacım var: harici çift dLot = 0.01; şununla değiştirin: extern double Lot = 0.01; ? oh hayır... bu da işe yaramıyor. 1...157815791580158115821583158415851586158715881589159015911592...1953 Yeni yorum
nasıl doğru yazılır?
"a" * "b" "x" kez, yani.
"x=3" ise
sonra "a*b*b*b"
a*MathPow(b,x)Teşekkürler, ancak bu kodumu hiçbir şekilde basitleştirmiyor)
Bu nedenle, 2 koşul, modül, fark ve bir koşul yerine aralığın ortasını hesaplamaya çalışıyorum.
Çok teşekkürler!
bağlı gibi, artık hata yok, ancak yine de çalışmıyor. Herhangi bir anlaşma açmıyor, kodun bölümleri arasında bağlantı olmadığını anlamıyorum:
lütfen bak, neyi yanlış yaptın?
Çok teşekkürler!
bağlı gibi, artık hata yok, ancak yine de çalışmıyor. Herhangi bir anlaşma açmıyor, kodun bölümleri arasında bağlantı olmadığını anlamıyorum:
Lütfen bakın neyi yanlış yaptınız?
yanlış
Çok teşekkürler!
bağlı gibi, artık hata yok, ancak yine de çalışmıyor. Herhangi bir anlaşma açmıyor, kodun bölümleri arasında bağlantı olmadığını anlamıyorum:
lütfen bak, neyi yanlış yaptın?
"Lot Hesaplama" fonksiyonunu verdiğim gibi ayarlayın (değişiklik yok)
ve vurgulananları ekleyin
yanlış
teşekkür etmek.
olduğu gibi döndü. Üç hata veriyor: 'Martin' - bildirilmemiş tanımlayıcı
başka bir global değişken ayarlamam gerekir mi?
teşekkür etmek.
olduğu gibi döndü. Üç hata veriyor: 'Martin' - bildirilmemiş tanımlayıcı
başka bir global değişken ayarlamam gerekir mi?
Burada
"Lot Hesaplama" fonksiyonunu verdiğim gibi ayarlayın (değişiklik yok)
ve vurgulananları ekleyin
yapılmış.
şimdi 'Lot' bildirilmemiş tanımlayıcıdır
ihtiyacım var: harici çift dLot = 0.01; şununla değiştirin: extern double Lot = 0.01; ?
oh hayır... bu da işe yaramıyor.