op = NP((dir==OP_BUY)
Поэтому только покупки открываются.
op = NP((dir==OP_BUY)
<code>//+------------------------------------------------------------------+ void SELLCLOSELimit() { bool cl; //int Slip=10; for(int i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol()) { if (OrderType()==OP_SELLLIMIT ) bool del=OrderDelete(OrderTicket()); RefreshRates(); } } } } //+------------------------------------------------------------------+ int start() { double buy = iCustom(NULL,0,IndName,PROC,StartHourr,StartMinute,EndHourr,EndMinute,0,2); double sell = iCustom(NULL,0,IndName,PROC,StartHourr,StartMinute,EndHourr,EndMinute,1,2); double bTP = iCustom(NULL,0,IndName,PROC,StartHourr,StartMinute,EndHourr,EndMinute,2,0); double sSL = iCustom(NULL,0,IndName,PROC,StartHourr,StartMinute,EndHourr,EndMinute,3,0); if(BULevel>0) BU(); if(CountBYU1()>0){ SELLCLOSE();BUYCLOSE();SELLCLOSELimit();} if(CountSELL1()>0){ BUYCLOSE();SELLCLOSE();BUYCLOSELimit();} if(CountBYU2()>0){ SELLCLOSE();BUYCLOSE();BUYCLOSELimit();SELLCLOSELimit();Trailing();} if(CountSELL2()>0){ BUYCLOSE();SELLCLOSE();SELLCLOSELimit();BUYCLOSELimit();Trailing();} if (CountTrades()==0) { OrderSend(Symbol(),OP_BUYSTOP,Lots,buy,Slip,sell,bTP,"",Magic,0,Blue); OrderSend(Symbol(),OP_SELLSTOP,Lots,sell,Slip,buy,sSL,"",Magic,0,Red); if (Limit==True){ OrderSend(Symbol(),OP_BUYLIMIT,Lots*KLot,sell-Shag*2*Point,Slip,0,0,"",Magic,0,Blue); OrderSend(Symbol(),OP_SELLLIMIT,Lots*KLot,buy+Shag*2*Point,Slip,0,0,"",Magic,0,Red); } } int h=TimeHour(TimeCurrent()); int m=TimeMinute(TimeCurrent()); if (h==EndHour && m>EndMinute) { BUYCLOSE();SELLCLOSE();SELLCLOSELimit();BUYCLOSELimit(); } return(0); } </code>
#property copyright "GDV"
#property link "GDV"
#property version "1.00"
#property strict
extern double Lots = 1.0; // лот
extern double KLot = 2; // умножение лота
extern double MaxLot = 5; // максимальный лот
extern int Shag = 100; // Отступ от SL для удвоения
extern bool Limit = False; // False(откл. лимитные ордера) True (вкл.)
extern int BULevel = 0; // уровень БУ
extern int BUPoint = 30; // пункты БУ
extern int TrailingStop = 100; // трал
extern int Slip = 10; // Проскальзывание цены
extern string IndName="MorningFlat_V3"; // Название индикатора
extern double PROC=0.5; // Процент выставления ТР и SL
extern int StartHourr=0; // Час начала инд
extern int StartMinute=15; // Мин начала инд
extern int EndHourr=8; // Час окончания инд
extern int EndMinute=45; // Мин окончания инд
extern int Magic = 1; // Magic
extern int EndHour = 23; // час окончания торговли
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
int CountTrades()
{
int count=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() )
{
if(OrderType()==OP_BUY || OrderType()==OP_BUYSTOP || OrderType()==OP_SELL || OrderType()==OP_SELLSTOP) count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
void ClosePos(int ot=-1)
{
bool cl;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==0 && (ot==0 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
}
if(OrderType()==1 && (ot==1 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
}
}
}
}
}
//+------------------------------------------------------------------+
void Trailing()
{
bool mod;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY)
{
if(Bid-OrderOpenPrice()>TrailingStop*Point)
{
if(OrderStopLoss()<Bid-TrailingStop*Point)
{
mod=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,OrderTakeProfit(),0,Yellow);
return;
}
}
}
if(OrderType()==OP_SELL)
{
if((OrderOpenPrice()-Ask)>TrailingStop*Point)
{
if((OrderStopLoss()>(Ask+TrailingStop*Point)) || (OrderStopLoss()==0))
{
mod=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,OrderTakeProfit(),0,Yellow);
return;
}
}
}
}
}
}
}
//+------------------------------------------------------------------+
void BU()
{
bool m;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY)
{
if(OrderOpenPrice()<=(Bid-(BULevel+BUPoint)*Point) && OrderOpenPrice()>OrderStopLoss())
{
m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+BUPoint*Point,OrderTakeProfit(),0,Green);
return;
}
}
if(OrderType()==OP_SELL)
{
if(OrderOpenPrice()>=(Ask+(BULevel+BUPoint)*Point) && OrderOpenPrice()<OrderStopLoss())
{
m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-BUPoint*Point,OrderTakeProfit(),0,Green);
return;
}
}
}
}
}
}
//+------------------------------------------------------------------+
double AllProfit(int type=-1)
{
double profit=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==type) profit+=OrderProfit()+OrderCommission()+OrderSwap();
if(type==-1)
{
if(OrderType()<2) profit+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
return (profit);
}
//+------------------------------------------------------------------+
bool isTradeTimeInt(int hb=0,int mb=0,int he=0,int me=0)
{
datetime db, de; // Время начала и окончания работы
int hc; // Часы текущего времени торгового сервера
db=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)hb+":"+(string)mb);
de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)he+":"+(string)me);
hc=TimeHour(TimeCurrent());
if(db>=de)
{
if(hc>=he) de+=24*60*60; else db-=24*60*60;
}
if(TimeCurrent()>=db && TimeCurrent()<=de) return(True);
else return(False);
}
//+------------------------------------------------------------------+
int CountBYU2()
{
int count=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() )
{
if (OrderLots()==Lots*KLot)
{
if(OrderType()==OP_BUY) count++;
}
}
}
}
return(count);
}
//-----------------------------------------------------------------------------------------------------
int CountSELL2()
{
int count=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
if (OrderLots()==Lots*KLot)
{
if(OrderType()==OP_SELL) count++;
}
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int CountBYU1()
{
int count=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() )
{
if (OrderLots()==Lots)
{
if(OrderType()==OP_BUY) count++;
}
}
}
}
return(count);
}
//-----------------------------------------------------------------------------------------------------
int CountSELL1()
{
int count=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
if (OrderLots()==Lots)
{
if(OrderType()==OP_SELL) count++;
}
}
}
}
return(count);
}
//+------------------------------------------------------------------+
void BUYCLOSE()
{
bool cl;
//int Slip=10;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
if (OrderType()==OP_BUYSTOP ) cl=OrderDelete(OrderTicket());
RefreshRates();
}
}
}
}
//+------------------------------------------------------------------+
void SELLCLOSE()
{
bool cl;
//int Slip=10;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
if (OrderType()==OP_SELLSTOP ) bool del=OrderDelete(OrderTicket());
RefreshRates();
}
}
}
}
//+------------------------------------------------------------------+
void BUYCLOSELimit()
{
bool cl;
//int Slip=10;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
if (OrderType()==OP_BUYLIMIT ) cl=OrderDelete(OrderTicket());
RefreshRates();
}
}
}
}
//+------------------------------------------------------------------+
что этим можно зарабатывать деньги и только он знает как
<code>//+------------------------------------------------------------------+ //| HedgeMartin.mq4 | //| Copyright 2016, AM2 | //| www.forexsystems.biz | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, AM2" #property link "http://forexsystems.biz" #property version "1.00" #property strict //--- Inputs extern double Loss = 9000; // убыток в валюте extern double Profit = 10; // профит в валюте extern double Lots = 0.1; // лот extern int Delta = 100; // дельта extern int Slip = 30; // проскальзывание extern int Magic = 123; // магик double lt[26]={0.1,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2}; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void PutOrder(int type,double price) { int r=0; color clr=Green; if(type==1 || type==3 || type==5) { clr=Red; } if(type==0 || type==2 || type==4) { clr=Blue; } r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,Digits),Slip,0,0,"",Magic,0,clr); return; } //+------------------------------------------------------------------+ int CountTrades() { int count=0; for(int i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic || OrderMagicNumber()==0)) { if(OrderType()<2) count++; } } } return(count); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int LastOrderType() { int type=0; if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic || OrderMagicNumber()==0)) { if(OrderType()==OP_BUY) type=1; //buy if(OrderType()==OP_SELL) type=2; //sell } } return(type); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double LastOrderOpenPrice() { double pr=0; if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic || OrderMagicNumber()==0)) { if(OrderType()<2) pr=OrderOpenPrice(); } } return(pr); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CloseAll(int ot=-1) { bool cl; for(int i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic || OrderMagicNumber()==0)) { if(OrderType()==0 && (ot==0 || ot==-1)) { RefreshRates(); cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White); } if(OrderType()==1 && (ot==1 || ot==-1)) { RefreshRates(); cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White); } } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double AllProfit() { double profit=0; for(int i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic || OrderMagicNumber()==0)) { if(OrderType()<2) profit+=OrderProfit()+OrderSwap()+OrderCommission(); } } } return(profit); } //+------------------------------------------------------------------+ double Lot() { double lot=lt[CountTrades()]; return(lot); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ /*double Lot() { double lot=Lots; if(CountTrades()>0) lot=NormalizeDouble(Lots*MathPow(KLot,CountTrades()),2); if(lot>MaxLot)lot=Lots; return(lot); }*/ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CountOrders(int type) { int count=0; for(int i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic || OrderMagicNumber()==0)) { if(OrderType()==type) count++; } } } return(count); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void DelOrder() { bool del; for(int i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()>1) del=OrderDelete(OrderTicket()); } } } return; } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { double delta=(double)ObjectGetString(0,"D",OBJPROP_TEXT); // открытие первого ордера if(CountTrades()<1 ) { PutOrder(0,Ask); } if(CountTrades()<1) DelOrder(); // открытие последующих ордеров if(CountTrades()>0) { if(LastOrderType()==1) { if(CountOrders(5)<1) PutOrder(5,LastOrderOpenPrice()-delta*Point); } if(LastOrderType()==2) { if(CountOrders(4)<1) PutOrder(4,LastOrderOpenPrice()+delta*Point); } } if(AllProfit()>Profit || AllProfit()<-Loss) { CloseAll(); DelOrder(); } Comment("\n Profit: ",DoubleToString(AllProfit(),2), "\n Last Order Type: ",LastOrderType(), "\n Count Trades: ",CountTrades(), "\n Delta: ",delta); } //+------------------------------------------------------------------+ </code>
Фактически, стратегия является без убыточнойаж пять штук различных ссоветников.Всех их обьуденяет одно название «HedgeMartin» и даже есть один, а может уже и два в МТ5.(Поищите в базе)
Вот например:
А дальше в функции OnTick прописываете отдельно два условия: одно для открытия сделок на покупку, одно для условия сделок на продажу
Или для вас принципиально, чтобы функция PutOrder у вас была своя.
Так я вам открою маленкую тайну: ни ваша, ни функция АМ2 не предназначена для торговли на реальном счёте(время от времени советник будет пропускать сигналы на вход(это я про реальный счёт говорю), пускай даже в тестере вы подберёте практически граальные настройки, на реале пара пропущенных сделок могут очень сильго сократить прибыль), так как в функции нет проверок.
Поэтому не мучайтесь: ни чего у вас не выйдет.
Ни кто не выложил в свободный доступ подобную функцию.
Игорь Ким выкладывал в 2008 году, но она сильно морально устарела(время от времени тоже пропускает входы).
Правда не так часто как функция PutOrder.Это я про упращённый вариант функции(на котором вы пытаетесь написать советник).
У АМ2 есть функция улучшеный вариант функции PutOrder (для торговли на реальном счёте)но этот вариант тоже время от времени пропускает сделки.
alex30774