MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 119
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
tamam anladım
Şu anda bunun kabul edilebilir bir formdan uzak olduğunu anlıyorum, ancak bir satın alma durumunda, sakince beyaz vermesine rağmen neden belirtilen rengin belirli bir kesikli çizgisini alamadığım gösterilebilir. ya da sadece yeşil.
İyi
çift OP = 5.00000
TP = (OP/100);
Yazdır("TP= ",TP);
2017.02.09 21:36:03.650 2015.01.05 04:00:00 martin H1-1 USDJPY,H1: TP= 0,5
5'i 100'e bölerken 0,5 olacağından anlamıyorum
Düzeltilmiş kodu sizin için olması gerektiği gibi gönderdim.
//| Close_MA.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
extern bool Uslovie1= false ; //Uslovie 4 6+50 MA
extern bool OpenOrders= false ; //+---Открыть ордер
extern double Lots= 0.01 ; //Oбьем открываемого ордера
extern const string Настройки_работы_советника= "" ;
extern int Period1= 6 ; //Период 1МА
extern ENUM_APPLIED_PRICE PRICE1= PRICE_MEDIAN ; // 1МА По цене
extern int Period2= 50 ; //Период 2МА
extern ENUM_APPLIED_PRICE PRICE2= PRICE_MEDIAN ; // 2МА По цене
extern int Period3= 1000 ; //Период 3МА
extern ENUM_APPLIED_PRICE PRICE3= PRICE_MEDIAN ; // 3МА По цене
extern uint X= 1 ; // отклонение от ма, пунктов
extern bool PlaySound = false ;
extern int M= 1000 ; // миллисекунды в Sleep
extern int R; // раз повторения музыки
extern int count= 0 ;
extern int Step= 500 ; // счетчик тиков 500макс.
int i; // исходный счетчик ордеров
int p= 0 ; // внутренняя для playSound
bool y = false ; // для удобства сравнений условий 1,2,3,4,5,6
bool dummy; // для выхода функций в переменную
int ticket = 0 ; // тикет открываемого ордера
int Magic= 222 ;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick ()
{
{
if ( Bars < 801 || ( IsTradeAllowed ()== false )) //--- Проверим достаточна ли в истории баров для анализа и разрешение торговли
return ;
}
//+----------------------------------------------------------------
double ma1= NormalizeDouble ( iMA ( NULL , 0 ,Period1, 0 , MODE_SMA ,PRICE1, 0 ), 5 );
double ma2= NormalizeDouble ( iMA ( NULL , 0 ,Period2, 0 , MODE_SMA ,PRICE1, 0 ), 5 ); //три заданных параметра ма
double ma3= NormalizeDouble ( iMA ( NULL , 0 ,Period3, 0 , MODE_SMA ,PRICE1, 0 ), 5 );
//+----------------------------------------------------------------- Открытие ордеров
//+----Купить
{
if ( MathAbs ( Bid -ma3)< 1000 * Point () && (myOrdersTotal()== false ))
{
ticket= OrderSend ( Symbol (), OP_BUY ,Lots, Ask , 50 , 0 , 0 , "" ,Magic, 0 , clrLightGray ); //+------отправка 1 ордера
HLineCreate( 0 , "buy" , 0 ,FindLastOrderOpenPrice(), clrAzure , STYLE_DASHDOT , 3 );
}
else if (( Ask >=(FindLastOrderOpenPrice()+(Step* _Point ))) && myOrdersTotal()) //+------------если ордер в плюс
{
ticket= OrderSend ( Symbol (), OP_BUY ,Lots, Ask , 50 , 0 , 0 , "" ,Magic, 0 , clrLightGray );
HLineMove( 0 , "buy" ,FindLastOrderOpenPrice());
}
else if (( Ask <=(FindLastOrderOpenPrice()-(Step* _Point ))) && myOrdersTotal()) //+------------если ордер вплюс
{
ticket= OrderSend ( Symbol (), OP_BUY ,Lots, Ask , 50 , 0 , 0 , "" ,Magic, 0 , clrLightGray );
HLineMove( 0 , "buy" ,FindLastOrderOpenPrice());
}
else if (ticket== 0 )
{
return ;
}
/*
//+----Продать
if(MathAbs(Bid-ma3)>1000*Point() && (myOrdersTotal()==false))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,"",Magic,0,clrLightGray);//+------отправка 1 ордера
HLineCreate1();
}
else if ((Ask>=(FindLastOrderOpenPrice()+(Step*_Point)))&& myOrdersTotal())//+------------если ордер в минус
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,"",Magic,0,clrLightGray);
HLineMove1();
}
else if ((Ask<=(FindLastOrderOpenPrice()-(Step*_Point)))&& myOrdersTotal())//+------------если ордер вплюс
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,"",Magic,0,clrLightGray);
HLineMove1();
}
else if(ticket==0)
{
return;
} */
}
//+------------------------------------------------------------------Условия
if (Uslovie1== true ) //Bid+ma800
{
if (( Bid >=ma3-X* Point && Bid <ma3) || ( Bid <=ma3+X* Point && Bid >ma3))
{
{y= true ;}
}
}
//+------------------------------------------------------------------закрыть покупки или продажи
if ((y== true ) && (myOrdersTotal()== true )) //продажа
{
dummy=( OrderClose ( OrderTicket (), OrderLots (), Ask , 0 ,White));
}
if ((y== true ) && (myOrdersTotal()== false ))
{
dummy= false ;
HLineDelete( 0 , "buy" );
// ExpertRemove();
}
}
//+------------------------------------------------------------------+
bool myOrdersTotal() //если ордера есть
{
for (i= OrdersTotal ()- 1 ; i>= 0 ; i--) // цикл будет работать пока не останется ордеров
{
if ((( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))== true ) && OrderSymbol ()== Symbol () && ( OrderType ()< 2 ))
{
return true ;
}
}
return false ;
}
//-------------------------------------------------------------------
double FindLastOrderOpenPrice()
{
double oldorderopenprice= 0 ;
int oldticket= 0 ;
ticket= 0 ;
for (i= OrdersTotal ()- 1 ; i>= 0 ; i--) // цикл будет работать пока не останется ордеров
{
if (( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) && OrderSymbol ()== Symbol () && ( OrderMagicNumber ()==Magic)
&& ( OrderType ()== OP_BUY || OrderType ()== OP_SELL ))
{
oldticket= OrderTicket ();
if (oldticket>=ticket)
{
ticket=oldticket;
oldorderopenprice= OrderOpenPrice ();
}
}
}
return (oldorderopenprice);
}
//-------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Создает горизонтальную линию |
//+------------------------------------------------------------------+
bool HLineCreate( const long chart_ID= 0 , // ID графика
const string name= "HLine" , // имя линии
const int sub_window= 0 , // номер подокна
double price= 0 , // цена линии
const color clr= clrRed , // цвет линии
const ENUM_LINE_STYLE style= STYLE_SOLID , // стиль линии
const int width= 1 , // толщина линии
const bool back= false , // на заднем плане
const bool selection= true , // выделить для перемещений
const bool hidden= true , // скрыт в списке объектов
const long z_order= 0 ) // приоритет на нажатие мышью
{
//--- если цена не задана, то установим ее на уровне текущей цены Bid
if (!price)
price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
//--- сбросим значение ошибки
ResetLastError ();
//--- создадим горизонтальную линию
if ( ObjectFind (chart_ID,name)!=sub_window)
{
if (! ObjectCreate (chart_ID,name, OBJ_HLINE ,sub_window, 0 ,price))
{
Print ( __FUNCTION__ ,
": не удалось создать горизонтальную линию! Код ошибки = " , GetLastError ());
return ( false );
}
}
//--- установим цвет линии
ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
//--- установим стиль отображения линии
ObjectSetInteger (chart_ID,name, OBJPROP_STYLE ,style);
//--- установим толщину линии
ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH ,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
//--- успешное выполнение
return ( true );
}
//+------------------------------------------------------------------+
//| Перемещение горизонтальной линии |
//+------------------------------------------------------------------+
bool HLineMove( const long chart_ID= 0 , // ID графика
const string name= "HLine" , // имя линии
double price= 0 ) // цена линии
{
//--- если цена линии не задана, то перемещаем ее на уровень текущей цены Bid
if (!price)
price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
//--- сбросим значение ошибки
ResetLastError ();
//--- переместим горизонтальную линию
if ( ObjectFind (chart_ID,name)==- 1 ) return ( false );
if (! ObjectMove (chart_ID,name, 0 , 0 ,price))
{
Print ( __FUNCTION__ ,
": не удалось переместить горизонтальную линию! Код ошибки = " , GetLastError ());
return ( false );
}
//--- успешное выполнение
return ( true );
}
//+------------------------------------------------------------------+
//| Удаляет горизонтальную линию |
//+------------------------------------------------------------------+
bool HLineDelete( const long chart_ID= 0 , // ID графика
const string name= "HLine" ) // имя линии
{
//--- сбросим значение ошибки
ResetLastError ();
//--- удалим горизонтальную линию
if ( ObjectFind (chart_ID,name)==- 1 ) return ( false );
if (! ObjectDelete (chart_ID,name))
{
Print ( __FUNCTION__ ,
": не удалось удалить горизонтальную линию! Код ошибки = " , GetLastError ());
return ( false );
}
//--- успешное выполнение
return ( true );
}
//+------------------------------------------------------------------+
...
tamam anladım
Şu anda bunun kabul edilebilir bir formdan uzak olduğunu anlıyorum, ancak bir satın alma durumunda, sakince beyaz vermesine rağmen neden belirtilen rengin belirli bir kesikli çizgisini alamadığım gösterilebilir. ya da sadece yeşil.
İyi
çift OP = 5.00000
TP = (OP/100);
Yazdır("TP= ",TP);
2017.02.09 21:36:03.650 2015.01.05 04:00:00 martin H1-1 USDJPY,H1: TP= 0,5
5'i 100'e bölerken 0,5 olacağından anlamıyorum
Orada neden düzgün bölemiyorsun bilmiyorum, her şeyi paylaşmak zorundayım.
{
//---
double OP = 5.00000 ;
double TP = OP/ 100 ;
Print ( "TP= " ,TP);
}
sonuç
2017.02 . 10 06 : 22 : 48.663 test USDCHF,H1: initialized
2017.02 . 10 06 : 22 : 48.663 test USDCHF,H1: TP= 0.05
2017.02 . 10 06 : 22 : 48.663 test USDCHF,H1: uninit reason 0
2017.02 . 10 06 : 22 : 48.663 Script test USDCHF,H1: removed
...
Orada neden düzgün bölemiyorsun bilmiyorum, her şeyi paylaşmak zorundayım.
Merhaba.
Sorunla başa çıkmaya yardımcı olun.
Açılış fiyatını değiştirerek bekleyen bir emri değiştiririm. Başarılı bir değişiklikten sonra yeni bir açılış fiyatı talep ediyorum. AT Cevap Veriliş eski , önceki fiyat . AT nasıl sorun ?
kod:
change=OrderModify(OrderTicket(),new_Pr+50*Point,OrderStopLoss(),OrderTakeProfit(),0,Mavi);
if(değiştir==doğru)
{
Print("BUYSTOP siparişini değiştir OrderOpenPrice() : ",OrderOpenPrice());
}
Ve kayıtlar günlük :
1. satın alma durağını değiştir 1.60150 sl'de 1.00 GBPUSD: 1.59590 tp: 1.63464 tamam
BUYSTOP emri, OrderOpenPrice()'i değiştir : 1.6028
1. satın alma durağını değiştir 1.60070 sl'de 1.00 GBPUSD: 1.59590 tp: 1.63464 tamam
BUYSTOP emri, OrderOpenPrice()'i değiştir : 1.6015
Merhaba.
Sorunla başa çıkmaya yardımcı olun.
Açılış fiyatını değiştirerek bekleyen bir emri değiştiririm. Başarılı bir değişiklikten sonra yeni bir açılış fiyatı talep ediyorum. AT Cevap Veriliş eski , önceki fiyat . AT nasıl sorun ?
kod:
change=OrderModify(OrderTicket(),new_Pr+50*Point,OrderStopLoss(),OrderTakeProfit(),0,Mavi);
if(değiştir==doğru)
{
Print("BUYSTOP siparişini değiştir OrderOpenPrice() : ",OrderOpenPrice());
}
Ve kayıtlar günlük :
1. satın alma durağını değiştir 1.60150 sl'de 1.00 GBPUSD: 1.59590 tp: 1.63464 tamam
BUYSTOP emri, OrderOpenPrice()'i değiştir : 1.6028
1. satın alma durağını değiştir 1.60070 sl'de 1.00 GBPUSD: 1.59590 tp: 1.63464 tamam
BUYSTOP emri, OrderOpenPrice()'i değiştir : 1.6015
OrderOpenPrice(), OrderSelect() uygulandığı sırada geçerli olan fiyatı içerir. Değerin kendisi hiçbir şekilde değişmeyecektir. Siparişi değiştirdikten sonra tekrar OrderSelect()'i çağırmanız gerekir.
Lütfen yardım et!
Amaç, dizideki sayıların sırasını korurken diziden sıfırları (diğer sayılar) kesmektir.
Böyle bir kod yaptım, ancak dizinin üzerine yazılmış - bir şeyler yanlış - lütfen bana neyin yanlış olduğunu söyleyin.
//| Test_MassivObrez.mq4 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart ()
{
int massivSize= 19 ; //размер массива
double summDelta[ 19 ]=
{
0 ,
20 ,
30 ,
0 ,
0 ,
51 ,
0 ,
53 ,
54 ,
60 ,
70 ,
80 ,
120 ,
150 ,
0 ,
210 ,
223 ,
232 ,
250 ,
0
};
int SizeMass= ArraySize (summDelta); //Узнаем размер массива
int CalcZrero= 0 ;
for ( int i= 0 ;i<SizeMass;i++)
{
Print ( "Число на проверку=" ,summDelta[i], " цикл " ,i);
if (summDelta[i]!= 0 )
{
Print ( "Число до исключения нуля=" ,summDelta[i], " цикл " ,i);
for ( int i= 0 ;i<SizeMass;i++) printf ( "Состав массива до исключения нуля summDelta[%d] = %G" ,i,summDelta[i]);
ArrayCopy (summDelta,summDelta,i-CalcZrero,i);
Print ( "Число после исключения нуля=" ,summDelta[i-CalcZrero], " цикл " ,i);
for ( int i= 0 ;i<SizeMass;i++) printf ( "Состав массива после исключения нуля summDelta[%d] = %G" ,i,summDelta[i]);
}
else CalcZrero++;
}
for ( int i= 0 ;i<SizeMass;i++) printf ( "Массив после исключения нуля summDelta[%d] = %G" ,i,summDelta[i]);
ArrayResize (summDelta,SizeMass-CalcZrero, 0 );
SizeMass= ArraySize (summDelta); //Узнаем новый размер массива
for ( int i= 0 ;i<SizeMass;i++) printf ( "Массив после исключения нуля и обрезания summDelta[%d] = %G" ,i,summDelta[i]);
}
//+------------------------------------------------------------------+
Lütfen yardım et!
Amaç, dizideki sayıların sırasını korurken diziden sıfırları (diğer sayılar) kesmektir.
Böyle bir kod yaptım, ancak dizinin üzerine yazılmış - bir şeyler yanlış - lütfen bana neyin yanlış olduğunu söyleyin.
//| Test_MassivObrez.mq4 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
Bunu şöyle yapardım:
double ResummDelta[]; // создадим новый массив
double summDelta[]=
{
0 ,
20 ,
30 ,
0 ,
0 ,
51 ,
0 ,
53 ,
54 ,
60 ,
70 ,
80 ,
120 ,
150 ,
0 ,
210 ,
223 ,
232 ,
250 ,
0
};
for ( int i= 0 ;i< ArraySize (summDelta);i++) {
if (summDelta[i]!= 0 ) {
n++;
ArrayResize (ResummDelta,n+ 1 );
ResummDelta[n]=summDelta[i];
}
}
// Print( ArraySize(summDelta)," = ",ArraySize(ResummDelta) );//Узнаем новый размер массива
Lütfen yardım et!
Amaç, dizideki sayıların sırasını korurken diziden sıfırları (diğer sayılar) kesmektir.
Böyle bir kod yaptım, ancak dizinin üzerine yazılmış - bir şeyler yanlış - lütfen bana neyin yanlış olduğunu söyleyin.
Önceden, farklı yapardım.
double b[ 20 ];
//--- Проверяем массив а на наличие 0 значений
int j = 0 ;
for ( int i = 0 ; i < 20 ; i++ )
{
if ( a[ i ] != 0 )
{
b[ j ] = a[ i ];
j++;
}
}
//--- Изменяем размер массива а на значение j
//--- Копируем массив b в массив a
Evet, bu şekilde gerçek sayıları 0 ile karşılaştırmanın doğruluğu hakkında hala bir soru var.
Oturup öyle bir görevi düşünüyorum ki, gerçek hayatta test edip etmesem de, kurmadım. Veya başka seçenekler sağlayın.
Diyelim ki bir sinyalim var - yayılmanın keskin bir şekilde genişlemesiyle (haberlerde)
tüm cari işlemleri kapat
Ama haberlere göre, emirlerin böyle kapanmasına veya açılmasına izin verilmeyecek.
öyleyse, bir komut alırsanız, OrderClose'u bir döngüye koyalım ve kapanana kadar ( OrderSend ile benzer şekilde) ve başarısız olabilecek diğer komutları çalıştıralım.