Что касается советника, графически изобразить мне показалось сложновато, попробую описать алгоритм словами:
хотелось бы чтобы при любом сигнале открывались ордера и в бай и в шелл
//+------------------------------------------------------------------+
//| Laban.mq4 |
//| Copyright 2015, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, AM2"
#property link "http://www.forexsystems.biz"
#property description "Simple expert advisor"
extern int StopLoss=200;
extern int TakeProfit=200;
extern int Slip=20;
extern int Hour_Start=8;
extern int Hour_Stop =17;
extern int Ma1 = 9;
extern int Ma2 = 22;
extern double Lots=0.01;
extern double KLot=2;
extern double KStop=2;
extern double MaxLot=5;
extern int Magic=8;
int mode=0;
bool b=true,s=true;
double stop=0,take=0;
//+------------------------------------------------------------------+
void OnTick()
{
//----
int p=0,r=0;
//---- get Indicatorrs
double ma1=iMA(NULL,0,Ma1,0,MODE_EMA,PRICE_CLOSE,1);
double ma2=iMA(NULL,0,Ma2,0,MODE_EMA,PRICE_CLOSE,1);
//----
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
}
}
//---- buy
if(ma1>ma2 && b && p<1)
{
if(Hour()>=Hour_Start && Hour()<Hour_Stop)
{
r=OrderSend(Symbol(),OP_BUY,Lot(),Ask,Slip,Ask-stop*Point,Ask+take*Point,"",Magic,0,Blue);
r=OrderSend(Symbol(),OP_SELL,Lot(),Bid,Slip,Bid+stop*Point,Bid-take*Point,"",Magic,0,Red);
b=false;
s=true;
}
}
//---- sell
if(ma1<ma2 && s && p<1)
{
if(Hour()>=Hour_Start && Hour()<Hour_Stop)
{
r=OrderSend(Symbol(),OP_SELL,Lot(),Bid,Slip,Bid+stop*Point,Bid-take*Point,"",Magic,0,Red);
r=OrderSend(Symbol(),OP_BUY,Lot(),Ask,Slip,Ask-stop*Point,Ask+take*Point,"",Magic,0,Blue);
b=true;
s=false;
}
}
Comment("\n stop: ",stop,"\n take: ",take);
//----
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Lot()
{
double lot=0;
if(OrdersHistoryTotal()==0)
{
lot=Lots;
take=TakeProfit;
stop=StopLoss;
}
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderProfit()>0)
{
lot=Lots;
take=TakeProfit;
stop=StopLoss;
}
if(OrderProfit()<0)
{
lot=OrderLots()*KLot;
take=MathAbs((OrderOpenPrice()-OrderTakeProfit())/Point)*KStop;
stop=MathAbs((OrderOpenPrice()-OrderStopLoss())/Point)*KStop;
}
}
if(lot>MaxLot)lot=Lots;
return(lot);
}
//+------------------------------------------------------------------+
бывает часто отложки не выставляет с ошибкой:
«OrderSend error 130»
Система DIBS Method — Ваше торговое преимущество.
//+------------------------------------------------------------------+
//| InBar.mq4 |
//| Copyright 2016, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link "http://www.forexsystems.biz"
#property version "1.00"
#property strict
//--- Inputs
extern double Lots = 0.1; // торговый объем ордера
extern int StopLoss = 500; // лось, если ноль стоп на экстремумы предыдущей свечи
extern int TakeProfit = 20; // язь
extern int TrailingStop = 300; // трал
extern int Expiration = 30; // истечение отложек в часах
extern int StartHour = 0; // час начала торговли
extern int StartMin = 30; // минута начала торговли
extern int EndHour = 23; // час окончания торговли
extern int EndMin = 30; // минута окончания торговли
extern int Slip = 30; // реквот
extern int BuyStop = 1; // 0-выкл. 1-вкл.
extern int SellStop = 1; // 0-выкл. 1-вкл.
extern int Magic = 123; // магик
//+------------------------------------------------------------------+
//| 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=clrNONE;
double sl=0,tp=0;
datetime expiration=0;
if(type==1 || type==3 || type==5)
{
clr=Red;
if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
if(StopLoss==0) sl=NormalizeDouble(High[2],Digits);
if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
}
if(type==0 || type==2 || type==4)
{
clr=Blue;
if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
if(StopLoss==0) sl=NormalizeDouble(Low[2],Digits);
if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
}
if(type==4 || type==5) expiration=TimeCurrent()+3600*Expiration;
r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,expiration,clr);
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
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)
{
if(OrderType()==type) count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
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)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void DelOrder()
{
bool del=true;
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());
}
}
}
}
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 30.04.2009 |
//| Описание : Возвращает флаг разрешения торговли по времени. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| hb - часы времени начала торговли |
//| mb - минуты времени начала торговли |
//| he - часы времени окончания торговли |
//| me - минуты времени окончания торговли |
//+----------------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Trailing()
{
bool mod;
for(int i=0; i<OrdersTotal(); 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;
}
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(CountTrades()<1 && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin))
{
if(Open[2]>Close[2] && Open[1]<Close[1] && Open[2]>Close[1])
{
if(CountOrders(4)<1 && Bid<Open[2] && BuyStop==1) PutOrder(4,Open[2]);
if(CountOrders(5)<1 && Bid>Close[2] && SellStop==1) PutOrder(5,Close[2]);
}
}
if(CountTrades()>0)
{
DelOrder();
}
if(TrailingStop>0) Trailing();
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Pepelats.mq4 |
//| Copyright 2016, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link "http://www.forexsystems.biz"
#property version "1.00"
#property description "Simple expert advisor"
//--- Inputs
extern double Lots = 0.1; // лот
extern int Stops = 0; // 0-стоп на одной цене. 1-лось каждому ордеру
extern int StopLoss = 500; // лось
extern int TakeProfit = 50; // язь
extern int BULevel = 100; // уровень БУ
extern int Count = 5; // число отложек
extern int Step = 200; // спред
extern int Buff = 1; // 1-61.8, 2-50, 3-38.2, 4-23.5
extern int Slip = 30; // реквот
extern int Expiration = 30; // истечение отложек в часах
extern int BarsCount = 500; // баров для расчета индикатора
extern int MAPeriod = 100; // период МА
extern int Magic = 123; // магик
extern string IndName="MA_Chanels_FIBO";
int OrdType=0;
double Stop=0,MarketPrice=0;
datetime TimeOpen=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Comment("");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
{
int r=0;
color clr;
double sl=0,tp=0;
datetime expiration=0;
if(type==1 || type==3 || type==5)
{
clr=Red;
if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
if(type>1 && Stops==0) sl=NormalizeDouble(Stop,Digits);
if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
}
if(type==0 || type==2 || type==4)
{
clr=Blue;
if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
if(type>1 && Stops==0) sl=NormalizeDouble(Stop,Digits);
if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
}
if(type==2 || type==3) expiration=TimeCurrent()+3600*Expiration;
r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,expiration,clr);
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
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)
{
if(OrderType()==type) count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
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)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void DelOrder()
{
bool del=true;
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());
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void BU()
{
bool m;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY)
{
if(OrderStopLoss()!=MarketPrice+20*Point)
{
m=OrderModify(OrderTicket(),OrderOpenPrice(),MarketPrice+20*Point,OrderTakeProfit(),0,Yellow);
return;
}
}
if(OrderType()==OP_SELL)
{
if(OrderStopLoss()!=MarketPrice-20*Point)
{
m=OrderModify(OrderTicket(),OrderOpenPrice(),MarketPrice-20*Point,OrderTakeProfit(),0,Yellow);
return;
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| OnTick function |
//+------------------------------------------------------------------+
void OnTick()
{
int i=0;
double up=0,dn=0;
if(Buff==1)
{
up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,0,1);
dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,7,1);
}
if(Buff==2)
{
up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,1,1);
dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,6,1);
}
if(Buff==3)
{
up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,2,1);
dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,5,1);
}
if(Buff==4)
{
up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,3,1);
dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,4,1);
}
if(CountTrades()<1)
{
if(Ask<dn && CountOrders(2)<1)//бай и бай лимит
{
PutOrder(0,Ask);
TimeOpen=TimeCurrent();
Stop=Ask-StopLoss*Point;
MarketPrice=Ask;
OrdType=0;
for(i=1; i<=Count;i++)
{
PutOrder(2,Ask-Step*Point*i);
}
}
if(Bid>up && CountOrders(3)<1)//селл и селл лимит
{
PutOrder(1,Bid);
TimeOpen=TimeCurrent();
Stop=Bid+StopLoss*Point;
MarketPrice=Bid;
OrdType=1;
for(i=1; i<=Count;i++)
{
PutOrder(3,Bid+Step*Point*i);
}
}
}
/*
if(LastOrderOpenTime()>=TimeOpen)
{
DelOrder();
}
*/
if(CountTrades()>0 && ((OrdType==0 && Bid-MarketPrice>BULevel*Point) || (OrdType==1 && MarketPrice-Ask>BULevel*Point)))
{
BU();
DelOrder();
}
Comment("\n Stop: ",Stop,
"\n MarketPrice: ",MarketPrice,
"\n OrderType: ",OrdType);
}
//+------------------------------------------------------------------+
Доработка (если она возможна):
Безубыток (true/false)
Можно ли в этом советнике вынести в настройки отключение/включение отложек бай/селл.
Андрей я точно помню, что был недавно в столе заказов топик по индикатору Ишимоку
#include <WinUser32.mqh>
#define PAUSE 10
#define VK_MENU 0x12 //ALT key
#define VK_CONTROL 0x11 //CTRL key
#define KEY_CODE 'Q'
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
void start()
{
keybd_event(VK_MENU,0,0,0);
Sleep(PAUSE);
keybd_event(KEY_CODE,0,0,0);
Sleep(PAUSE);
keybd_event(KEY_CODE,0,2,0);
Sleep(PAUSE);
keybd_event(VK_MENU,0,2,0);
}
AM2