

www.opentraders.ru/downloads/3881/
Перепроверьте пожалуйста, не перепутаны ли условия в части сигналов от MA Channels Fibo
//+------------------------------------------------------------------+
//| Petro.mq5 |
//| Copyright 2024, AM2. |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, AM2."
#property link "http://www.forexsystems.biz"
#property version "1.00"
#include <Trade\Trade.mqh> // Подключаем торговый класс CTrade
//--- входные параметры группы 1
input double Lot1 = 1; // лот 1
input double Lot2 = 0.5; // лот 2
input double Profit = 11; // Профит в валюте
input string Symb1 = "EURUSD"; // 1-й символ
input string Symb2 = "GBPUSD"; // 2-й символ
input int Step = 333; // шаг
input int Slip = 30; // Проскальзывание
CTrade trade; // Используем торговый класс CTrade
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CloseAll(string symb="")
{
for(int i=PositionsTotal()-1; i>=0; i--)
{
if(PositionSelectByTicket(PositionGetTicket(i)))
{
if(PositionGetString(POSITION_SYMBOL)==symb || PositionGetString(POSITION_SYMBOL)==NULL)
{
trade.PositionClose(PositionGetTicket(i),Slip);
}
}
}
}
//+------------------------------------------------------------------+
//| Position Profit |
//+------------------------------------------------------------------+
double AllProfit(string symb="")
{
double p=0;
for(int i=PositionsTotal()-1; i>=0; i--)
{
if(PositionSelectByTicket(PositionGetTicket(i)))
{
if(PositionGetString(POSITION_SYMBOL)==symb || PositionGetString(POSITION_SYMBOL)==NULL)
{
p+=PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP);
}
}
}
return(p);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountTrades(string symb)
{
int count=0;
for(int i=PositionsTotal()-1; i>=0; i--)
{
if(PositionSelectByTicket(PositionGetTicket(i)))
{
if(PositionGetString(POSITION_SYMBOL)==symb || PositionGetString(POSITION_SYMBOL)==NULL)
{
if(OrderGetInteger(ORDER_TYPE)<2)
count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double FindLastBuyPrice(string symb)
{
double pr=0;
for(int i=PositionsTotal()-1; i>=0; i--)
{
if(PositionSelectByTicket(PositionGetTicket(i)) && PositionGetInteger(POSITION_TYPE)==0)
{
if(PositionGetString(POSITION_SYMBOL)==symb)
{
pr=PositionGetDouble(POSITION_PRICE_OPEN);
break;
}
}
}
return(pr);
}
//+------------------------------------------------------------------+
//| Position Profit |
//+------------------------------------------------------------------+
int PositionType(string symb)
{
int type=8;
for(int i=PositionsTotal()-1; i>=0; i--)
{
if(PositionSelectByTicket(PositionGetTicket(i)))
{
if(PositionGetString(POSITION_SYMBOL)==symb)
{
type=(int)PositionGetInteger(POSITION_TYPE);
break;
}
}
}
return(type);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Trade(string symb)
{
double pr=0;
double ask=SymbolInfoDouble(symb,SYMBOL_ASK);
double bid=SymbolInfoDouble(symb,SYMBOL_BID);
int dg=(int)SymbolInfoInteger(symb,SYMBOL_DIGITS);
double pp=SymbolInfoDouble(symb,SYMBOL_POINT);
if(CountTrades(Symb1)<1)
{
pr=NormalizeDouble(ask,dg);
trade.Buy(Lot1,Symb1,pr,0,0,"");
}
if(CountTrades(Symb2)<1 && CountTrades(Symb1)>1)
{
pr=NormalizeDouble(ask,dg);
trade.Sell(Lot1,Symb2,pr,0,0,"");
}
if(CountTrades(symb)>0 && CountTrades(symb)<2)
{
if(PositionType(symb)==0 && (FindLastBuyPrice(symb)-ask)/pp>=Step)
{
trade.Sell(Lot2,symb,bid,0,0);
}
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(Symb1!="")
Trade(Symb1);
if(Symb2!="")
Trade(Symb2);
if(AllProfit(NULL)>Profit)
CloseAll(NULL);
if(AllProfit(Symb1)>Profit)
CloseAll(Symb1);
if(AllProfit(Symb2)>Profit)
CloseAll(Symb2);
}
//+------------------------------------------------------------------+
Сейчас он выставляет только ордера бай, поэтому не идет.
Идет в минус, на расстоянии 20 пунктов открываем селл 0,5.
AM2