![*hi*](http://opentraders.ru/templates/skin/g6h/images/smilies/hi.gif?newyear)
И так до бесконечности увеличиваем период медленной МАшки, пока не исчезнет сигнал на том баре, на котором есть сигнал от пересечения мувингов с первоначальными настройками.После чего выводим период медленной МАшки
//+------------------------------------------------------------------+
//| Lot symb1 & Lot symb2.mq4 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| http://www.mункцql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "http://www.mункцql5.com"
#property version "1.00"
#property strict
input string SYMBOL1 = "EURUSD"; //второй символ
input string SYMBOL2 = "GBPUSD"; //первый символ
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
double ynax=MarketInfo(SYMBOL1, MODE_TICKVALUE)/MarketInfo(SYMBOL2, MODE_TICKVALUE)*
(iOpen(SYMBOL1,0,0)/MarketInfo(SYMBOL1, MODE_TICKSIZE))/(iOpen(SYMBOL2,0,0)/MarketInfo(SYMBOL2, MODE_TICKSIZE));
double minx=0, miny=0, mindelta=9999;
for (double x=0.01; x<=1; x+=0.01)
{
for (double y=0.01; y<=1; y+=0.01)
{
double delta=MathAbs(y/x-ynax);
if (delta<mindelta)
{
minx=NormalizeDouble(x,2);
miny=NormalizeDouble(y,2);
mindelta=NormalizeDouble(delta,2);
}
}
}
string LotsS1 = DoubleToStr(minx,2);
string LotsS2 = DoubleToStr(miny,2);
Comment(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),
" \n Символ №1 - "+SYMBOL1+" "+DoubleToString(LotsS1,2),
" \n Символ №2 - "+SYMBOL2+" "+DoubleToString(LotsS2,2)
);
}
//+------------------------------------------------------------------+
А код если прогнать тестере покажет точные места входа и выхода из сделок.
А лот подбираю также на дневках, с помощью индикатора i-Diff2Pairs.
//+------------------------------------------------------------------+
//| Corel2.mq5 |
//| Copyright 2022, AM2 |
//| https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, AM2"
#property link "https://www.forexsystems.biz"
#property version "1.00"
#include <Trade\Trade.mqh> // Подключаем торговый класс CTrade
CTrade trade;
//--- входные параметры
input double Lot = 1; // Лот
input string Symb = "USDCHF"; // 2-й символ
input double LotSymb = 1; // Лот
input int Loss = 0; // Лось в валюте
input int Profit = 50; // Профит в валюте
input double Sigma = 333; // Расхождение пар
input bool CloseCross = 1; // Закрытие по пересечению
input bool CloseHour = 1; // Закрытие по пересечению
input uchar AfterHour = 5; // Закрыть позиции через AfterHour часов
input int Slip = 0; // Проскальзывание
input ulong Magic = 123; // Магик
input string IndName = "Coral";
input int bar = 55;
int ind=0;
double s1[2],s2[2];
datetime t=0;
long afterhour = 0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
ind=iCustom(NULL,0,IndName,Symb,bar);
trade.SetExpertMagicNumber(Magic);
afterhour = 0;
afterhour=AfterHour*60*60;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Position Profit |
//+------------------------------------------------------------------+
double AllProfit()
{
double p=0;
for(int i=PositionsTotal()-1; i>=0; i--)
{
if(PositionSelectByTicket(PositionGetTicket(i)))
{
if(PositionGetInteger(POSITION_MAGIC)==Magic)
{
p+=PositionGetDouble(POSITION_PROFIT);
}
}
}
return(p);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CloseAll()
{
for(int i=PositionsTotal()-1; i>=0; i--)
{
if(PositionSelectByTicket(PositionGetTicket(i)))
{
if(PositionGetInteger(POSITION_MAGIC)==Magic)
{
if(PositionGetInteger(POSITION_TYPE)<2)
{
trade.PositionClose(PositionGetTicket(i));
}
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountTrades()
{
int count=0;
for(int i=PositionsTotal()-1; i>=0; i--)
{
if(PositionSelectByTicket(PositionGetTicket(i)))
{
if(PositionGetInteger(POSITION_MAGIC)==Magic)
{
if(PositionGetInteger(POSITION_TYPE)<2)
count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CloseAfterHour()
{
//---
for(int i=PositionsTotal()-1; i>=0; i--)
if(m_position.SelectByIndex(i))
{
if(TimeCurrent()-m_position.Time()>=afterhour) CloseAll();
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double Ask1=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
double Bid1=SymbolInfoDouble(_Symbol,SYMBOL_BID);
double Ask2=SymbolInfoDouble(Symb,SYMBOL_ASK);
double Bid2=SymbolInfoDouble(Symb,SYMBOL_BID);
double sigma=MathAbs(s1[0]-s2[0])/_Point;
CopyBuffer(ind,0,0,2,s1);
CopyBuffer(ind,1,0,2,s2);
if(CloseHour)CloseAfterHour();
if(t!=iTime(NULL,0,0))
{
if(CountTrades()<1 && sigma>Sigma)
{
if(s1[0]<s2[0])
{
trade.Buy(Lot,_Symbol,Ask1,0,0,"");
trade.Sell(LotSymb,Symb,Bid2,0,0,"");
}
if(s1[0]>s2[0])
{
trade.Sell(Lot,_Symbol,Bid1,0,0,"");
trade.Buy(LotSymb,Symb,Ask2,0,0,"");
}
}
if((AllProfit()>Profit && Profit>0) || (AllProfit()<-Loss && Loss>0) || (s1[0]>s2[0] && s1[1]<s2[1]&& CloseCross) || (s1[0]<s2[0] && s1[1]>s2[1] && CloseCross))
CloseAll();
t=iTime(NULL,0,0);
}
Comment("\n Trades: ",CountTrades(),
"\n Profit: ",AllProfit(),
"\n Sigma: ",sigma,
"\n Symbol1: ",s1[0],
"\n Symbol2: ",s2[0]);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Corel2.mq5 |
//| Copyright 2022, AM2 |
//| https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, AM2"
#property link "https://www.forexsystems.biz"
#property version "1.00"
#include <Trade\Trade.mqh> // Подключаем торговый класс CTrade
#include <Trade\PositionInfo.mqh>
CTrade trade;
CPositionInfo m_position;
//--- входные параметры
input double Lot = 1; // Лот
input string Symb = "USDCHF"; // 2-й символ
input double LotSymb = 1; // Лот
input int Loss = 0; // Лось в валюте
input int Profit = 50; // Профит в валюте
input double Sigma = 333; // Расхождение пар
input bool CloseCross = 1; // Закрытие по пересечению
input bool CloseHour = 1; // Закрытие по пересечению
input uchar AfterHour = 5; // Закрыть позиции через AfterHour часов
input int Slip = 0; // Проскальзывание
input ulong Magic = 123; // Магик
input string IndName = "Coral";
input int bar = 55;
int ind=0;
double s1[2],s2[2];
datetime t=0;
long afterhour = 0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
ind=iCustom(NULL,0,IndName,Symb,bar);
trade.SetExpertMagicNumber(Magic);
afterhour = 0;
afterhour=AfterHour*60*60;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Position Profit |
//+------------------------------------------------------------------+
double AllProfit()
{
double p=0;
for(int i=PositionsTotal()-1; i>=0; i--)
{
if(PositionSelectByTicket(PositionGetTicket(i)))
{
if(PositionGetInteger(POSITION_MAGIC)==Magic)
{
p+=PositionGetDouble(POSITION_PROFIT);
}
}
}
return(p);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CloseAll()
{
for(int i=PositionsTotal()-1; i>=0; i--)
{
if(PositionSelectByTicket(PositionGetTicket(i)))
{
if(PositionGetInteger(POSITION_MAGIC)==Magic)
{
if(PositionGetInteger(POSITION_TYPE)<2)
{
trade.PositionClose(PositionGetTicket(i));
}
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountTrades()
{
int count=0;
for(int i=PositionsTotal()-1; i>=0; i--)
{
if(PositionSelectByTicket(PositionGetTicket(i)))
{
if(PositionGetInteger(POSITION_MAGIC)==Magic)
{
if(PositionGetInteger(POSITION_TYPE)<2)
count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CloseAfterHour()
{
//---
for(int i=PositionsTotal()-1; i>=0; i--)
if(m_position.SelectByIndex(i))
{
if(TimeCurrent()-m_position.Time()>=afterhour)
m_trade.PositionClose(m_position.Ticket());
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double Ask1=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
double Bid1=SymbolInfoDouble(_Symbol,SYMBOL_BID);
double Ask2=SymbolInfoDouble(Symb,SYMBOL_ASK);
double Bid2=SymbolInfoDouble(Symb,SYMBOL_BID);
double sigma=MathAbs(s1[0]-s2[0])/_Point;
CopyBuffer(ind,0,0,2,s1);
CopyBuffer(ind,1,0,2,s2);
if(CloseHour)CloseAfterHour();
if(t!=iTime(NULL,0,0))
{
if(CountTrades()<1 && sigma>Sigma)
{
if(s1[0]<s2[0])
{
trade.Buy(Lot,_Symbol,Ask1,0,0,"");
trade.Sell(LotSymb,Symb,Bid2,0,0,"");
}
if(s1[0]>s2[0])
{
trade.Sell(Lot,_Symbol,Bid1,0,0,"");
trade.Buy(LotSymb,Symb,Ask2,0,0,"");
}
}
if((AllProfit()>Profit && Profit>0) || (AllProfit()<-Loss && Loss>0) || (s1[0]>s2[0] && s1[1]<s2[1]&& CloseCross) || (s1[0]<s2[0] && s1[1]>s2[1] && CloseCross))
CloseAll();
t=iTime(NULL,0,0);
}
Comment("\n Trades: ",CountTrades(),
"\n Profit: ",AllProfit(),
"\n Sigma: ",sigma,
"\n Symbol1: ",s1[0],
"\n Symbol2: ",s2[0]);
}
//+------------------------------------------------------------------+
|| (AllProfit()<-Loss && Loss>0
Даже и не знаю что писать и какие сканы.
Открытие первых позиций как и было в прошлом заказе.
Перемещение линий как и было в прошлом заказе
Только вместо тейпрофита и стоплосса советник на этих линиях должен выставить отложенные ордера байстоп и селлстоп.
Закрытие всех позиций и удаление всех отложенных ордеров по общему профиту.
Всё.
ssg