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