SN Simple Swing
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «sn simple swing v10.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Этот файл является торговым советником для MetaTrader 4, написанным на MQL4. Советник использует пользовательские макросы для объявления входных параметров и подключает внешние include-файлы из библиотеки sovetnikovGUI для работы с ордерами и кнопками. В коде присутствуют обработчики событий OnInit, OnDeinit, OnTick, OnTimer и OnChartEvent, что подтверждает его назначение как эксперта.
Основная логика советника включает открытие рыночного ордера при отсутствии позиций, управление ордерами с использованием отложенных ордеров и множителя лота, а также закрытие всех ордеров при достижении заданного уровня профита или при срабатывании риск-менеджера по эквити. Советник отображает на графике информационную панель с текущими показателями прибыли, спреда и других параметров, а также кнопку STOP для ручного закрытия всех сделок.
В настройках доступны параметры для управления проскальзыванием, комментарием к ордерам, расстоянием для отложенных ордеров, условиями закрытия по профиту, риском, множителем лота, уровнем стоп-лосса в процентах, а также параметрами отображения текста и кнопок. Советник поддерживает работу с несколькими символами при включении соответствующей опции.
Настройки программы
| Настройка | Описание |
|---|---|
| slippage | Максимально допустимое проскальзывание в пунктах при открытии ордеров. Значение 0 означает, что проскальзывание не используется. |
| comment | Текстовый комментарий, добавляемый к отправляемым торговым ордерам. |
| distance | Расстояние в пунктах от цены открытия последнего ордера для установки отложенного ордера. |
| CloseByProfit | Определяет, будет ли советник закрывать все сделки при достижении заданного уровня прибыли. |
| Profit | Целевой уровень прибыли в валюте депозита, при достижении которого советник закрывает все сделки. |
| AllSymbols | При включении советник учитывает прибыль по всем символам при принятии решения о закрытии сделок, а также отправляет команду на закрытие всем советникам на других графиках. |
| risk | Риск в процентах от баланса, используемый для расчета размера лота. |
| Lot_Multiplicator | Множитель для расчета лота следующего отложенного ордера относительно лота предыдущего ордера. |
| order_sl | Уровень стоп-лосса в процентах, используемый при расчете размера лота. |
| FONT_SIZE | Задает размер шрифта для текста на кнопке STOP в пунктах. |
| text_size | Размер шрифта для текста информационной панели в пунктах. |
| background_width | Ширина фона информационной панели в пикселях. |
| RiskManager_Stop | Уровень эквити в валюте депозита, при достижении которого советник закрывает все сделки и останавливает торговлю. |
Поиск по коду файла
#property version "10.00"
#property strict
#include <sovetnikovGUI\Orders.mqh>
#include <sovetnikovGUI\Button.mqh>
#define CLOSE_MESSAGE 2409
I slippage=0;
S comment="";
D distance=30; //Distance (pt)
B CloseByProfit=true; //Close By Profit Use
D Profit=3; //Profit ($)
B AllSymbols=false; //All Symbols Profit
D risk=1; //Risk (%)
D Lot_Multiplicator=2;
D order_sl=0.5; //SL %
I FONT_SIZE=10; //Button Text Size (points)
I text_size=10; //Text Size (points)
C text_color=clrWhite; //Text Color
C background_color=clrBlack; //Background Color
I background_width=200; //Backgroud Width (pixels)
D RiskManager_Stop=0; //Equity Stop (level equity $)
class CMyOrders: public COrders
{
public:
virtual int Update(datetime dtm=0,int iticket=-1)
{
__COPYRIGHT__
ArrayResize(m_orders,0);
m_all=0;
ArrayInitialize(orders,0);
int isize=0;
int itotal=::OrdersTotal();
m_total=itotal; //запомним для проверок кол-ва лимита ордеров
for(int i=0;i<itotal;i++)
{
if(!::OrderSelect(i,SELECT_BY_POS)) continue; //если не выбирает, пропускаем
if(CheckSymbol(::OrderSymbol()) && ::OrderOpenTime()>=dtm)
{
if((!options_bSupportMaxLot && CheckMagic(::OrderMagicNumber(),::OrderComment())) || options_bSupportMaxLot || ::OrderTicket()==iticket)
{
isize=ArraySize(m_orders); //кол-во оредров в структуре
if(ArrayResize(m_orders,isize+1)!=-1)
{
if(m_orders[isize].getOrderByTicket(::OrderTicket())) //загрузим информацию по ордеру (грузим все ордера)
{
if(CheckMagic(m_orders[isize].OrderMagicNumber,m_orders[isize].OrderComment) || m_orders[isize].OrderTicket==iticket)
{
orders[m_orders[isize].OrderType]++; //увеличим счетчик
m_all++;
}
}
}
}
}
}
return m_all; //вернем кол-во ордеров в структуре
}
virtual int getOrderTicket(int itype=ALL,const int imode=MODE_TRADES,const datetime dttm=0,bool bHistoryOpenOrderTime=true,bool bUpdate=false)
{
__COPYRIGHT__
datetime dtm=0,dtm_open=0;
int iticket=-1,icount=0;
int flag;
if(ArraySize(m_orders)==0 || bUpdate) Update();
icount=ArraySize(m_orders);
for(int i=icount-1;i>=0;i--)
{
if(m_orders[i].OrderCloseTime>0) continue;
if(!CheckSymbol(m_orders[i].OrderSymbol)) continue;
if(m_orders[i].OrderMagicNumber==m_imagic || m_orders[i].OrderTicket==m_imagic)
{
dtm_open=m_orders[i].OrderOpenTime;
flag=toMyTypes(m_orders[i].OrderType)&itype;
if(m_orders[i].OrderType==toDefType(flag,itype) && dtm_open>=dttm && dtm_open>=dtm)
{
dtm=dtm_open;
iticket=m_orders[i].OrderTicket;
}
}
}
return iticket;
}
virtual double getProfit(bool bAll)
{
double pr=0;
int itotal=::OrdersTotal();
for(int i=0;i<itotal;i++)
{
if(!::OrderSelect(i,SELECT_BY_POS)) continue; //если не выбирает, пропускаем
if((!bAll && CheckSymbol(::OrderSymbol())) || bAll)
{
pr+=::OrderProfit()+::OrderSwap()+::OrderCommission();
}
}
return NormalizeDouble(pr,3);
}
};
class CMain: public CMainDefault
{
protected:
CMyOrders m_main,m_tmp;
SNButton m_stop;
CDraw draw;
public:
virtual int OnInit()
{
// код доступен только после оплаты
}
virtual void OnDeinit(const int reason)
{
m_main.OnDeinit();
m_stop.Destroy();
draw.OnDeinit();
}
virtual void OnTick()
{
// код доступен только после оплаты
}
if(!m_main.IsWork()) return; //отключена торговля
m_stop.SetSize(60);
int iwidth=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
m_stop.Create(0,"m_stop",0,iwidth-70,20);
m_stop.Text("STOP");
m_main.OnTick();
m_main.Update(); //получим кол-во ордеров в структуре orders
double step=getStop();
double lot=0;
if(step>0) lot=m_main.getLotBySL(risk,step);
if(m_main.m_all==0 )
{
m_main.m_imagic=0;
m_main.OrderSend(OP_BUY,lot,-1,0,0,"test",0);
m_main.m_imagic=-1;
return;
}
if(AccountEquity()<=RiskManager_Stop && RiskManager_Stop>0 && m_main.m_all>0)
{
Print("Equity RiskManager_Stop: ",DoubleToString(AccountEquity(),2)," EA is Stop");
m_main.OrderCloseAll(ALL);
return;
}
double curr_profit=m_main.getProfit();
double day_profit=m_main.GetProfitDay(0);
double month_profit=m_main.GetProfitMonth(0);
double summ_profit1=curr_profit+day_profit;
double summ_profit2=curr_profit+month_profit;
double start_balance1=AccountBalance()-summ_profit1;
double start_balance2=AccoПоказано первые 50% кода (символов: 6836)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.