Bu takas hesaplama yöntemine rollover denir. MT4'te bunu programlı olarak öğrenmek imkansızdır. Sadece dolaylı olarak, işleyen piyasa emirleriyle gece yarısı geçişinden sonra. MT4'te bu kadar küçük ama oldukça nahoş problemler var. MT5'te biraz daha az ama yine de mevcut.
Bunlar puan cinsinden takas değerleridir. Piyasa emrinin hacmine bağlı olarak mevduat para birimine çevrilmeleri gerekir. Daha sonra takasın gerçek boyutu elde edilecektir.
" MT4'te bunu programlı olarak öğrenmek imkansız." - Cevaplamak için zaman ayırdığınız için teşekkür ederiz.
Tünaydın! Sevgili forum kullanıcıları, algoritmayı çözmeme yardım etmenizi rica ediyorum. Görev, belirli bir süre içinde fiyat aralığını belirlemek ve maksimum ve minimumda bir alım-durdurma ve satış-durdurma belirlemektir. Zarar Durdurma, zıt emirlere göre belirlenir.Kar Al, Zarar Durdur*2'ye eşit olmalıdır.
Ayrıca, her zarar durdur kapanışından sonra, emir kapatılanla aynı zarar durdur ve kar al ile geri yüklenir, emirlerden biri kar al ile kapatıldıktan sonra tüm döngü sona erer. Ve en baştan aralığı belirliyoruz ve gidelim.
Ancak şimdi TP'yi daha doğru bir şekilde koymuyor, ancak açılış fiyatı ve zararı durdurma, aralığın boyutuyla değil, yani. zıt yönlü bir düzende değil. Yardımınız için şimdiden teşekkür ederim.
staticint prevtime = 0 ;
int MagicNumber = 12345678 ;
inputint stoploss = 40 ;
inputint takeprofit = 50 ;
inputint padding = 5 ;
int a= 1 ;
inputstring startTime = "14:35" ;
inputstring endTime = "18:35" ;
int expertBars;
double max, min;
bool isEndTime = true ;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit ()
{
//---//sendOrders();return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+#include <expert.mq4>
int start()
{
//Возвращает максимум и минимум за промежутокif (isTime()) getMaxMin();
// всё, что задается ниже - будет работать по "ценам открытия"//нового бара, т.е. будет срабатывать в момент его появления//на том графике, на кот. стоит советник
CheckEvents( MagicNumber );
if ( eventBuyClosed_SL > 0 ) {
Alert ( _Symbol , OrderClosePrice (), ": Buy-позиция закрыта по СтопЛоссу!" );
double minstoplevel= MarketInfo ( Symbol (), MODE_STOPLEVEL );
Alert ( "Минимальный стоп левел: " , minstoplevel);
OrderSend ( _Symbol , OP_BUYSTOP , OrderLots (), OrderOpenPrice (), 3 , OrderStopLoss (), OrderTakeProfit (), "My order" ,MagicNumber, 0 , clrGreen );
}
if ( eventBuyClosed_TP > 0 ) {
Alert ( _Symbol , OrderClosePrice (), ": Buy-позиция закрыта по ТейкПрофиту!" );
deleteAllPaddingOrders();
}
if ( eventSellClosed_SL > 0 ) {
Alert ( _Symbol , OrderClosePrice (), ": Sell-позиция закрыта по СтопЛоссу!" );
double minstoplevel= MarketInfo ( Symbol (), MODE_STOPLEVEL );
Alert ( "Минимальный стоп левел: " , minstoplevel);
OrderSend ( _Symbol , OP_SELLSTOP , OrderLots (), OrderOpenPrice (), 3 , OrderStopLoss (), OrderTakeProfit (), "My order" ,MagicNumber, 0 , clrRed );
}
if ( eventSellClosed_TP > 0 ) {
Alert ( _Symbol , OrderClosePrice (), ": Sell-позиция закрыта по ТейкПрофиту!" );
deleteAllPaddingOrders();
}
if ( eventBuyLimitOpened > 0 || eventBuyStopOpened > 0 ||
eventSellLimitOpened > 0 || eventSellStopOpened > 0 )
Alert ( _Symbol , OrderType (), ": сработал отложенный ордер!" );
return ( 0 );
}
//-----------------------------------------------------------------+void deleteAllPaddingOrders() {
int total = OrdersTotal ();
for ( int i=total- 1 ;i>= 0 ;i--)
{
OrderSelect (i, SELECT_BY_POS );
int type = OrderType ();
if ( OrderMagicNumber () != MagicNumber) continue ;
if ( OrderSymbol () != _Symbol ) continue ;
bool result = false ;
switch (type)
{
//Close opened long positionscaseOP_BUY : result = OrderClose ( OrderTicket (), OrderLots (), MarketInfo ( OrderSymbol (), MODE_BID ), 5 , Red );
break ;
//Close opened short positionscaseOP_SELL : result = OrderClose ( OrderTicket (), OrderLots (), MarketInfo ( OrderSymbol (), MODE_ASK ), 5 , Red );
// break;//Close pending orders//case OP_BUYLIMIT ://case OP_SELLLIMIT :caseOP_BUYSTOP :
caseOP_SELLSTOP : result = OrderDelete ( OrderTicket () );
}
if (result == false )
{
Alert ( "Order " , OrderTicket () , " failed to close. Error:" , GetLastError () );
Sleep ( 3000 );
}
return ;
}
return ;
}
void sendOrders( bool isFirst) {
//--- получим минимальное значение Stop leveldouble minstoplevel= MarketInfo ( Symbol (), MODE_STOPLEVEL );
Print ( "Minimum Stop Level=" ,minstoplevel, " points" );
//--- BUYSTOP//--- вычисленные значения цен SL и TP должны быть нормализованы//--- размещаем рыночный ордер на покупку 1 лотаint ticketBuyStop, ticketSellStop;
if (!isFirst) {
ticketBuyStop= OrderSend ( Symbol (), OP_BUYSTOP , 1 , Ask + padding * Point , 20 , Bid -padding* Point , Ask + padding * Point , "My order" ,MagicNumber, 0 , clrGreen );
ticketSellStop= OrderSend ( Symbol (), OP_SELLSTOP , 1 , Bid - padding * Point , 20 , Ask + padding* Point , Bid - padding * Point , "My order" ,MagicNumber, 0 , clrRed );
} else {
ticketBuyStop= OrderSend ( Symbol (), OP_BUYSTOP , 1 ,max + padding * Point , 20 ,min -padding* Point ,max + (max - min + padding) * Point , "My order" ,MagicNumber, 0 , clrGreen );
ticketSellStop= OrderSend ( Symbol (), OP_SELLSTOP , 1 ,min - padding * Point , 20 ,max + padding* Point ,min - (max - min + padding)* Point , "My order" ,MagicNumber, 0 , clrRed );
}
if (ticketBuyStop< 0 )
{
Print ( "OrderSend завершилась с ошибкой #" , GetLastError ());
deleteAllPaddingOrders();
if (a <= 5 ) {
//sendOrders(isFirst);
a= a+ 1 ;
}
}
elsePrint ( "Функция OrderSend успешно выполнена" );
//---BUYSTOP//---SELLSTOP//--- вычисленные значения цен SL и TP должны быть нормализованы//--- размещаем рыночный ордер на покупку 1 лотаif (ticketSellStop< 0 )
{
deleteAllPaddingOrders();
if (a <= 5 ) {
//sendOrders();
a= a+ 1 ;
Print ( "a" , a);
}
Print ( "OrderSend завершилась с ошибкой #" , GetLastError ());
}
elsePrint ( "Функция OrderSend успешно выполнена" );
//---SELLSTOPreturn ;
}
bool getMaxMin() {
int startIndex = iBarShift ( _Symbol , 0 , StrToTime (startTime), true );
min= iLow ( NULL , 0 , iLowest ( NULL , 0 , MODE_LOW ,startIndex, 0 ));
max= iHigh ( NULL , 0 , iHighest ( NULL , 0 , MODE_HIGH ,startIndex, 0 ));
Alert ( "Min: " , min);
Alert ( "Max: " , max);
sendOrders( true );
returntrue ;
}
//===============================================================================+//======| возвращает true если временной диапозон кончился |//===============================================================================+bool isTime() {
if ( TimeHour ( StrToTime (startTime)) == Hour () && TimeMinute ( StrToTime (startTime)) == Minute () && isEndTime) { Alert ( "Start Timeline" ); isEndTime = false ; deleteAllPaddingOrders();};
if ( TimeHour ( StrToTime (endTime)) == Hour () && TimeMinute ( StrToTime (endTime)) <= Minute () && !isEndTime) { Alert ( "End Timeline" ); isEndTime = true ; returntrue ;};
returnfalse ;
}
//=====================================================================+//======| возвращает true если появился новый бар, иначе false |//=====================================================================+//bool isNewBar()//{//bool res=false;//if(expertBars!=iBars(Symbol(),0))//{//expertBars=iBars( Symbol (),0);//res=true;//}//return(res);//}
Günlükte test ederken, bir OrderSend hatası 130 hatası oluşuyor - eğer doğru anlarsam, bu yalnızca duraklamalar veya almalarla ilişkilendirilebilir, lütfen neyin yanlış olduğuna bakın:
#define MagicNumber1 100//Buyinputdouble MaximumRisk= 0.03 ; //Max риск в сделке
input double K=1; //Коэффициент риск к прибыли
inputint OrderPoint= 30 ; //Расстояние до отложенного ордераdouble Price= 0 ; //Цена для установки отложенного ордераdouble SL= 0 ; //Stop Lossdouble TP= 0 ; //Take Profitdouble Lots= 0 ; //Просчет лотности исходя из max риска одной сделкиvoidOnTick ()
{
//Параметры для открытия ордера
Price = NormalizeDouble ( High [ 1 ]+OrderPoint* Point , Digits ); //Цена открытия ордера
SL = NormalizeDouble ( Low [ 1 ]- Point , Digits ); //Стоп лоссif ((Price-SL)< NormalizeDouble ( MarketInfo ( Symbol (), MODE_STOPLEVEL )* Point , Digits ))
{SL=Price- NormalizeDouble ( MarketInfo ( Symbol (), MODE_STOPLEVEL )* Point , Digits );}
TP = NormalizeDouble ((Price-SL)*K+Price, Digits ); //Тэйк профит//Просчет лотности исходя из риска в сделке
Lots = NormalizeDouble ((( AccountBalance ()*MaximumRisk/ 100.0 )/((Price-SL)* 1000.0 )), 1 );
//Установка отложенного ордераbool send1= OrderSend ( Symbol (), OP_BUYSTOP ,Lots,Price, 3 ,SL,TP, "comment" ,MagicNumber1, 0 , clrGreen );
}
Günlükte test ederken, OrderSend hatası 130 hatası oluşuyor - doğru anlarsam, yalnızca duraklamalar veya almalarla ilişkilendirilebilir,
Bekleyen emirlerin açılış fiyatları da etkilenir. Bu nedenle, mevcut piyasa fiyatı ile emir açılış fiyatı arasındaki mesafeyi de kontrol etmeniz gerekir. Bu durumda: Fiyat - Sor.
Bekleyen emirlerin açılış fiyatları da etkilenir. Bu nedenle, mevcut piyasa fiyatı ile emir açılış fiyatı arasındaki mesafeyi de kontrol etmeniz gerekir. Bu durumda: Fiyat - Sor.
Benim için zor. Kodun hangi kısmına ekleneceğini ve mn ve mag_n ne anlama geldiğini açıklayabilir misiniz? Sihir danışmanımı buraya nereden girebilirim?
Bu takas hesaplama yöntemine rollover denir. MT4'te bunu programlı olarak öğrenmek imkansızdır. Sadece dolaylı olarak, işleyen piyasa emirleriyle gece yarısı geçişinden sonra. MT4'te bu kadar küçük ama oldukça nahoş problemler var. MT5'te biraz daha az ama yine de mevcut.
Bunlar puan cinsinden takas değerleridir. Piyasa emrinin hacmine bağlı olarak mevduat para birimine çevrilmeleri gerekir. Daha sonra takasın gerçek boyutu elde edilecektir.
" MT4'te bunu programlı olarak öğrenmek imkansız." - Cevaplamak için zaman ayırdığınız için teşekkür ederiz.
Tünaydın! Sevgili forum kullanıcıları, algoritmayı çözmeme yardım etmenizi rica ediyorum. Görev, belirli bir süre içinde fiyat aralığını belirlemek ve maksimum ve minimumda bir alım-durdurma ve satış-durdurma belirlemektir. Zarar Durdurma, zıt emirlere göre belirlenir.Kar Al, Zarar Durdur*2'ye eşit olmalıdır.
Ayrıca, her zarar durdur kapanışından sonra, emir kapatılanla aynı zarar durdur ve kar al ile geri yüklenir, emirlerden biri kar al ile kapatıldıktan sonra tüm döngü sona erer. Ve en baştan aralığı belirliyoruz ve gidelim.
Ancak şimdi TP'yi daha doğru bir şekilde koymuyor, ancak açılış fiyatı ve zararı durdurma, aralığın boyutuyla değil, yani. zıt yönlü bir düzende değil. Yardımınız için şimdiden teşekkür ederim.
Soruları farklı başlıklarda tekrarlamaya gerek yok.
Tünaydın!
Günlükte test ederken, bir OrderSend hatası 130 hatası oluşuyor - eğer doğru anlarsam, bu yalnızca duraklamalar veya almalarla ilişkilendirilebilir, lütfen neyin yanlış olduğuna bakın:
Tünaydın!
Günlükte test ederken, OrderSend hatası 130 hatası oluşuyor - doğru anlarsam, yalnızca duraklamalar veya almalarla ilişkilendirilebilir,
Bekleyen emirlerin açılış fiyatları da etkilenir. Bu nedenle, mevcut piyasa fiyatı ile emir açılış fiyatı arasındaki mesafeyi de kontrol etmeniz gerekir. Bu durumda: Fiyat - Sor.
Bekleyen emirlerin açılış fiyatları da etkilenir. Bu nedenle, mevcut piyasa fiyatı ile emir açılış fiyatı arasındaki mesafeyi de kontrol etmeniz gerekir. Bu durumda: Fiyat - Sor.
Hour() işlevi ne döndürür?
Geçerli saati döndürür. Çalışıyorum: mevcut saat 11'den büyük ve 17'den azsa,
peki nasıl olmalı?
Benim için zor. Kodun hangi kısmına ekleneceğini ve mn ve mag_n ne anlama geldiğini açıklayabilir misiniz? Sihir danışmanımı buraya nereden girebilirim?
Durumunu koymadan önce
mag_n - danışmanın mag'sini buraya girin.
Geçerli saati döndürür. Yazıyorum: eğer mevcut saat 11'den fazla ve 17'den az ise nasıl olmalı?
Anladığım kadarıyla soru göstergeyle ilgili. Hour() -> time[i] yerine
Anladığım kadarıyla soru göstergeyle ilgili. Hour() -> time[i] yerine
Evet, yardım ettin, şimdi zamanı sınırlamak istiyorum. 17:00'den 11:00'e kadar saymayı hariç tutun.