Coin Flip
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «coin_flip.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Советник для MetaTrader 4, выполняющий торговлю на основе случайного выбора направления. Открывает рыночные ордера на покупку или продажу с использованием торговых API платформы. Поддерживает управление рисками, автоматический расчёт размера лота и трейлинг-стоп для защиты прибыли.
Настройки программы
| Настройка | Описание |
|---|---|
| Risk | Риск — Доля риска от баланса для расчёта размера лота |
| Lot | Лот — Базовый размер лота при ручном или фиксированном режиме |
| Martingale | Мартингейл — Множитель увеличения лота после убыточной сделки |
| MaxLot | Максимальный лот — Верхний предел размера лота |
| TakeProfit | Тейк-профит — Уровень фиксации прибыли в пунктах от цены входа |
| StopLoss | Стоп-лосс — Уровень стоп-лосса в пунктах от цены входа |
| MaxAttempts | Максимум попыток — Максимальное количество повторных попыток отправки ордера при реквоте |
| Pause | Пауза — Задержка между повторными попытками отправки ордера в секундах |
| Slippage | Допуск цены — Допустимое проскальзывание в пунктах при открытии ордера |
| TrailingStart | Начало трейлинга — Расстояние в пунктах от цены входа для активации трейлинг-стопа |
| TrailingStop | Шаг трейлинга — Расстояние в пунктах для фиксации трейлинг-стопа |
| Magic | Магический номер — Идентификатор ордеров, открытых советником |
| Com | Комментарий — Текст комментария, добавляемый к открываемым ордерам |
| DrawInfo | Отображение информации — Включает или отключает вывод информационных меток на график |
| Languages | Язык — Выбор языка интерфейса информационных меток |
| TextColor | Цвет текста — Цвет информационных меток на графике |
Поиск по коду файла
#property version "1.00"
#property strict
enum lang
{
en=0, // English
ru=1, // Russian
};
input double Risk = 0.25;
input double Lot = 0.01;
input double Martingale = 1.8;
input double MaxLot = 1.0;
input int TakeProfit = 50;
input int StopLoss = 25;
input int MaxAttempts = 10;
input int Pause = 30;
input int Slippage = 10;
input int TrailingStart = 14;
input int TrailingStop = 3;
sinput int Magic = 12345;
sinput string Com = "Coin Flip";
input bool DrawInfo = true;
input lang Languages = en;
input color TextColor = clrWhite;
double iMartingale,TP,SL;
int dig=1,ticket,iTrailingStart,iTrailingStop,CountBuy,CountSell,iTakeProfit,iStopLoss;
uint l_orders[];
int OnInit()
{
// код доступен только после оплаты
}
void OnDeinit(const int reason)
{
for(int i=0; i<ObjectsTotal(0,-1,-1);i++)
{
if(StringFind(ObjectName(0,i),"Label")>=0)
if(ObjectDelete(0,ObjectName(0,i)))
i--;
}
}
void OnTick()
{
// код доступен только после оплаты
}
bool LastOrderLoss(int magic,double &lot)
{
lot=0;
for(int i=(OrdersHistoryTotal()-1); i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
if(OrderMagicNumber()==magic)
{
if(OrderProfit()<0)
lot=OrderLots();
break;
}
if(lot>0)
return true;
else
return false;
}
double NormalizeLot(double lot)
{
double minLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
double maxLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
double stepLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
if(lot>0)
{
lot=MathMax(minLot,lot);
lot=MathMin(maxLot,lot);
lot=minLot+NormalizeDouble((lot-minLot)/stepLot,0)*stepLot;
}
else
lot=0;
return lot;
}
double MoneyManagement()
{
double lots=0;
double Free_Equity=AccountEquity();
if(Free_Equity<=0)return(0);
double TickValue=MarketInfo(Symbol(),MODE_TICKVALUE);
double LotStep=MarketInfo(Symbol(),MODE_LOTSTEP);
lots=MathFloor((Free_Equity*MathMin(Risk,100)/100)/(StopLoss*dig*TickValue)/LotStep)*LotStep;
double MinLots=MarketInfo(Symbol(),MODE_MINLOT);
double MaxLots=MarketInfo(Symbol(),MODE_MAXLOT);
if(lots<MinLots)lots=MinLots;
if(lots>MaxLots)lots=MaxLots;
if(Risk<=0)lots=Lot;
return(lots);
}
double NormalizeLots(double lots,string l_Symbol)
{
double result=0;
double minLot=SymbolInfoDouble(l_Symbol,SYMBOL_VOLUME_MIN);
double maxLot=SymbolInfoDouble(l_Symbol,SYMBOL_VOLUME_MAX);
double stepLot=SymbolInfoDouble(l_Symbol,SYMBOL_VOLUME_STEP);
if(lots>0)
{
lots=MathMax(minLot,lots);
lots=minLot+NormalizeDouble((lots-minLot)/stepLot,0)*stepLot;
result=MathMin(maxLot,lots);
}
else
result=minLot;
return (NormalizeDouble(result,2));
}
int AntiRequoteOrderSend(string symbol,int cmd,double volume,double pric,int slippage,double stoploss,double takeprofit,string comment="",int magic=0,datetime expiration=0,color arrow_color=CLR_NONE)
{
ticket=0;
int cnt=0;
while(true)
{
if(cnt>=MaxAttempts) {Print("order not opened after ",MaxAttempts," attempts"); break;}
cnt++;
ticket=OrderSend(symbol,cmd,volume,pric,slippage,stoploss,takeprofit,comment,magic,expiration,arrow_color);
if(ticket>0) break;
Sleep(Pause*1000);
}
return(ticket);
}
void CountOrders(int &l_CountBuy,int &l_CountSell,int l_Magic)
{
l_CountBuy=l_CountSell=0;
for(int i=0; i<OrdersTotal(); i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Symbol && OrderMagicNumber()==l_Magic)
{
if(OrderType()==ORDER_TYPE_BUY)
l_CountBuy++;
if(OrderType()==ORDER_TYPE_SELL)
l_CountSell++;
}
return;
}
double value_profit()
{
double ID=0;
int OT=OrdersTotal();
if(OT>0)
{
for(int i=OT-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
ID+=OrderProfit()+OrderSwap()+OrderCommission();
}
}
}
return(ID);
}
void SetLabel(string nm,string tx,color cl,int xd,int yd,int cr=0,int fs=9,string font="Tahoma")
{
if(ObjectFind(nm)<0) ObjectCreate(nm,OBJ_LABEL,0,0,0);
ObjectSetText(nm,tx,fs,font,cl);
ObjectSet(nm,OBJPROP_COLOR,cl);
ObjectSet(nm,OBJPROP_XDISTANCE,xd);
ObjectSet(nm,OBJPROP_YDISTANCE,yd);
ObjectSet(nm,OBJPROP_CORNER,cr);
ObjectSet(nm,OBJPROP_FONTSIZE,fs);
ObjectSet(nm,OBJPROP_BACK,false);
ObjectSet(nm,OBJPROP_SELECTABLE,false);
ObjectSet(nm,OBJPROP_READONLY,false);
}
double TotalProfit()
{
{
double OProfit=0;
for(int i=0; i<OrdersHistoryTotal(); i++)
{
if(!(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
if(OrderCloseTime()>=iTime(Symbol(),PERIOD_MN1,1200))OProfit+=OrderProfit();
}
return (OProfit);
}
}
double Profit(int Bar)
{
double OProfit=0;
for(int i=0; i<OrdersHistoryTotal(); i++)
{
if(!(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
if(OrderCloseTime()>=iTime(Symbol(),PERIOD_D1,Bar) && OrderCloseTime()<iTime(Symbol(),PERIOD_D1,Bar)+86400) OProfit+=OrderProfit();
}
return (OProfit);
}
double ProfitMons(int Bar)
{
double OProfit=0;
for(int i=0; i<OrdersHistoryTotal(); i++)
{
if(!(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
if(OrderCloseTime()>=iTime(Symbol(),PERIOD_MN1,Bar) && OrderCloseTime()<iTime(Symbol(),PERIOD_MN1,Bar)+2592000) OProfit+=OrderProfit();
}
return (OProfit);
}
string Error(int error_code)
{
string error_string;
switch(error_code)
{
case 0:
error_string="no error returned."; break;
case 1:
error_string="no error returned, but the result is unknown."; break;
case 2:
error_string="common error."; break;
case 3:
error_string="invalid trade parameters."; break;
case 4:
error_string="trade server is busy."; break;
case 5:
error_string="old version of the client terminal."; break;
case 6:
error_string="no connection with trade server."; break;
case 7:
error_string="not enough rights."; break;
case 8:
error_string="too frequent requests."; break;
case 9:
error_string="malfunctional trade operation."; break;
case 64:
error_string="account disabled."; break;
case 65:
error_string="invalid account."; break;
case 128:
error_string="trade timeout."; break;
case 129:
error_string="invalid price."; break;
case 130:
error_string="invalid stops."; break;
case 131:
error_string="invalid trade volume."; break;
case 132:
error_string="marketПоказано первые 50% кода (символов: 18880)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.