serg_martini2.mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «serg_martini2.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Данный исходный код представляет собой торгового советника (эксперта) для платформы MetaTrader 4 на языке MQL4. Советник управляет сеткой ордеров, создавая начальные позиции на покупку и продажу, а также размещая дополнительные лимитные и стоповые ордера на последующих уровнях. Он выполняет модификацию существующих ордеров, изменяя их стоп-лосс и тейк-профит, а также удаляет устаревшие ордера при определённых условиях. Между операциями реализована задержка для контроля потока запросов к торговому серверу.
Настройки программы
| Настройка | Описание |
|---|---|
| StartLots | Начальный лот — Начальный размер лота для открытия новых позиций и ордеров. |
| Step | Шаг — Величина шага в пунктах, используемая для расчёта цен размещения ордеров и уровней. |
| StepFactor | Множитель шага — Множитель, применяемый для увеличения шага на последующих уровнях ордеров. |
| TimeOut | Таймаут — Задержка между торговыми операциями в миллисекундах. |
Поиск по коду файла
/*
???????? ???????? ?????? ?? ???????????
***************************************
??????? ????????? ??????? ??????????? ???????
101.102.103.104.105 - ?????????????? ?????? ?? ???
201.202.203.204.205 - ?????????????? ?????? ?? ????
*/
extern double StartLots = 0.1;
extern double Step = 20;
extern double StepFactor = 1;
extern double TimeOut = 5000;
void setNewTakeProfitBuy(double NewTP) {
int TotalOrd, TekOrd, Tiket, Error;
TotalOrd = OrdersTotal();
for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber() >= 101 && OrderMagicNumber() <= 105) {
if (NormalizeDouble(OrderTakeProfit(),Digits) != NormalizeDouble(NewTP, Digits) ) {
Tiket = OrderModify(OrderTicket(), OrderOpenPrice(), 0, NewTP, 0, Green);
Print ("??????????? TP ??? OP_BUY. TP_New = ", OrderTakeProfit(), "->", NewTP, " lots= ", OrderLots(), " num= ", OrderTicket());
Print ("????????? = ",Tiket);
if (Tiket !=1 ) {Error = GetLastError(); Print ("?????? = ", Error); }
Sleep(TimeOut);
}
}
}
}
void setNewTakeProfitSel(double NewTP) {
int TotalOrd, TekOrd, Tiket, Error;
TotalOrd = OrdersTotal();
for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderMagicNumber() >= 201 && OrderMagicNumber() <= 205) {
if ( NormalizeDouble(OrderTakeProfit(),Digits) != NormalizeDouble(NewTP, Digits) ) {
Tiket = OrderModify(OrderTicket(), OrderOpenPrice(), 0, NewTP, 0, Yellow);
Print ("??????????? TP ??? OP_SELL. TP_New = ", OrderTakeProfit(), "->", NewTP, " lots= ", OrderLots(), " num= ", OrderTicket() );
Print ("????????? = ",Tiket);
if (Tiket !=1 ) {Error = GetLastError(); Print ("?????? = ", Error); }
Sleep(TimeOut);
}
}
}
}
double getNextOrderPriceByNum(int n1, double p1){
switch (n1) {
case 101: return (p1-Step*Point); //??? ?????? ???? ?????????? ?????? ???? ?? ??? ? ?????? ???????
case 102: return (p1-Step*MathPow(StepFactor,1)*Point);
case 103: return (p1-Step*MathPow(StepFactor,2)*Point);
case 104: return (p1-Step*MathPow(StepFactor,3)*Point);
case 201: return (p1+Step*Point); //??? ?????? ???? ?????????? ?????? ???? ?? ??? ? ?????? ???????
case 202: return (p1+Step*MathPow(StepFactor,1)*Point);
case 203: return (p1+Step*MathPow(StepFactor,2)*Point);
case 204: return (p1+Step*MathPow(StepFactor,3)*Point);
}
return (0);
}
int modOrder(int num, double oprice, double prprice){
int t, cnt1, tic, err;
double p1, p2;
t=OrdersTotal();
for(cnt1=0;cnt1<t;cnt1++){
OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol()==Symbol() && OrderMagicNumber()==num){
if ((OrderOpenPrice()!=oprice || OrderTakeProfit()!=prprice) && oprice!=0 && prprice!=0) {
if (OrderType()==OP_BUYLIMIT){
p1=oprice;
p2=prprice;
if (NormalizeDouble(OrderOpenPrice(),Digits)!=NormalizeDouble(p1,Digits) || NormalizeDouble(OrderTakeProfit(),Digits)!=NormalizeDouble(p2,Digits) ) {
tic=OrderModify(OrderTicket(),p1,0,p2,0,Red);
Print ("????? BUYLIMIT ", OrderOpenPrice(), "->", p1, " t/p ", OrderTakeProfit(),"->", p2);
Print ("????????? = ",tic);
if (tic!=1) {err=GetLastError(); Print ("?????? = ",err);}
Sleep(TimeOut);
}
}
if (OrderType()==OP_SELLLIMIT){
p1=oprice;
p2=prprice;
if (NormalizeDouble(OrderOpenPrice(),Digits)!=NormalizeDouble(p1,Digits)
|| NormalizeDouble(OrderTakeProfit(),Digits)!=NormalizeDouble(p2,Digits)) {
tic=OrderModify(OrderTicket(),p1,0,p2,0,Green);
Print ("????? SELLLIMIT ", OrderOpenPrice(), "->", p1, " t/p ", OrderTakeProfit(),"->", p2);
Print ("????????? = ",tic);
if (tic!=1) {err=GetLastError();
Print ("?????? = ",err);}
Sleep(TimeOut);
}
}
}
}
}
return (1);
}
bool isMagNum(int mode, int num) {
int TotalOrd, TekOrd;
TotalOrd = OrdersTotal();
for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
if (mode == 1) {
if (OrderMagicNumber()==num && OrderSymbol()==Symbol()) return (True); // ???????????? ????????
}
if (mode == 2) {
if (OrderMagicNumber()==num && OrderSymbol()==Symbol() && (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) ) return (True); // ???????????? ????????
}
}
return (False); }
bool isOrderActive(int num) {
int TotalOrd, TekOrd;
TotalOrd = OrdersTotal();
for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol()==Symbol() && OrderMagicNumber()== num && (OrderType()==OP_BUY || OrderType()==OP_SELL)) { return (True); } // ???????????? ????????
}
return (False);
}
int getMaxLongNum(){
int topL = 0, TotalOrd, TekOrd;
TotalOrd = OrdersTotal();
for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber()>topL) topL = OrderMagicNumber();
}
return (topL); // ???????????? ?????????? ????? ??????
}
int getMaxShortNum(){
int topL = 0, TotalOrd, TekOrd;
TotalOrd = OrdersTotal();
for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderMagicNumber()>topL ) topL = OrderMagicNumber();
}
return (topL); // ???????????? ?????????? ????? ??????
}
int getTopLevel (int mode) {
int TotalOrd, TekOrd, MaxLevel, cLev=0;
TotalOrd = OrdersTotal();
if (mode == 1) { //???????? ?????? ??? ??????
for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol()==Symbol() && OrderType()==OP_BUY ) { //?????? ?????????????? ???????
switch (OrderMagicNumber()) {
case 105: cLev=5; break;
case 104: cLev=4; break;
case 103: cLev=3; break;
case 102: cLev=2; break;
case 101: cLev=1; break;
}
if (cLev > MaxLevel) MaxLevel = cLev;
}
} return (MaxLevel);
}
if (mode == 2) { //???????? ?????? ??? ??????
for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol()==Symbol() && OrderType()==OP_SELL ) { //?????? ?????????????? ???????
switch (OrderMagicNumber()) {
case 205: cLev=5; break;
case 204: cLev=4; break;
case 203: cLev=3; break;
case 202: cLev=2; break;
case 201: cLev=1; break;
}
if (cLev > MaxLevel) MaxLevel = cLev;
}
} return (MaxLevel);
}
}
double getOrderPriceByNum (int num) {
int t, cnt1;
t=OrdersTotal();
for(cnt1=0;cnt1<t;cnt1++){
OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol()==Symbol() && OrderMagicNumber()== num) { return (OrderOpenPrice()); }
}
return (0);
}
int getNextOrderNum(int n1){
switch (n1) {
case 101: return (102);
case 102: return (103);
case 103: return (104);
case 104: return (105);
case 201: return (202);
case 202: return (203);
case 203: return (204);
case 204: return (205);
}
return (0);
}
double getLotByLevel(int Level) {
double Lot1;
Lot1 = StartLots;//???????? ?? ?????????
switch( Level ) {
case 3: Lot1 = StartLots*2; break;
case 4: Lot1 = StartLots*4; break;
case 5: Lot1 = StartLots*8; break;
}
return (Lot1);
}
void Create_Prima_Buy() {
int Tiket, Error;
Tiket = OrderSend(Symbol(), OP_BUY, StartLots, Ask, 3, 0, Ask+Step*Point,"101 ?????? ??????? ??????", 101,0, Red);
Print("???????? ?????? ??????? ????? ?????? 101 ??? -> ",Symbol()," Ask = ", Ask," T/P = ",Ask+Step*Point," ?i?et = ",Tiket);
if ( Tiket == -1 ) {Error = GetLastError(); Print ("?????? ???????? ?????? ??????? ?????? 101 = ",Error); }
Sleep(TimeOut);
}
void Create_Prima_Sell() {
int Tiket, Error;
Tiket = OrderSend(Symbol(), OP_SELL, StartLots, Bid,3,0,Bid-Step*Point,"201 ?????? ??????? ??????", 201, 0, Green);
Print("???????? ?????? ??????? ????? ?????? 201 ??? -> ",Symbol()," Bid = ", Bid, " ?/? = ", Bid-Step*Point, " ?iket = ",Tiket);
if (Tiket == -1) {Error = GetLastError(); Print ("?????? ???????? ?????? ??????? ????? ?????? 201 = ", Error); }
Sleep(TimeOut);
}
void Create_Modify_Prima_BuyStop() {
int TotalOrd, TekOrd;
int Tiket, Error;
int MaxMagNumBuy; // ????? ?????????? ???????????? ?????????? ????? ????????? ?????? ??? ??????
double OrderPriceBuy ; // ???? ???????? ?????? ?? ??? ??????????? ??????
double PriceBuyStop; // ???? ???????? ??????????? ?????? STOP
MaxMagNumBuy = getMaxLongNum(); // ????? ?????????? ???????????? ?????????? ????? ????????? ?????? ??? ??????
OrderPriceBuy = getOrderPriceByNum( MaxMagNumBuy ); // ????????? ???? ???????? ?????? ?? ??? ??????????? ??????
PriceBuyStop = OrderPriceBuy + Step*Point + (Point * MarketInfo(Symbol(),MODE_SPREAD) ); // ???? ???????? ??????????? ?????? STOP
if (isMagNum(2,101) == False) { //--- ???? ??? ?? ??????? ?????
Tiket = OrderSend(Symbol(), OP_BUYSTOP, StartLots, PriceBuyStop, 3, 0, PriceBuyStop + Step*Point,"BUY_STOP_?101", 101,0, Red);
Print("???????? BUY_STOP_?101 ??? -> ",Symbol()," Ask = ", PriceBuyStop," T/P = ",PriceBuyStop+Step*Point," ?i?et = ",Tiket);
if ( Tiket == -1 ) {Error = GetLastError(); Print ("?????? ???????? BUY_STOP_?101 = ",Error); }
Sleep(TimeOut); }
else { //--- ????? ????????? ??? ? ???? ???? ???????????? ???
TotalOrd = OrdersTotal();
for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber()==101 && OrderSymbol()==Symbol() && OrderType()==OP_BUYSTOP ) { // ????? ?????????? ????? BUY_STOP
if (NormalizeDouble(OrderOpenPrice(),Digits)!=NormalizeDouble(PriceBuyStop,Digits) || NormalizeDouble(OrderTakeProfit(),Digits)!=NormalizeDouble((PriceBuyStop + Step*Point),Digits) ) {
Tiket = OrderModify(OrderTicket(),PriceBuyStop,0,(PriceBuyStop + Step*Point),0,Red);
Print ("??????????? BUY_STOP_?101 ", OrderOpenPrice(), "->", PriceBuyStop, " t/p = ", OrderTakeProfit()," -> ", (PriceBuyStop + Step*Point));
if ( Tiket == 0 ) {Error = GetLastError(); Print ("?????? ??????????? BUY_STOP_?101 = ",Error); }
Sleep(TimeOut); break;
}
}
}
}
}
void Create_Modify_Prima_SellStop() {
int TotalOrd, TekOrd;
int Tiket, Error;
int MaxMagNumSell; // ????? ?????????? ???????????? ?????????? ????? ????????? ?????? ??? ??????
double OrderPriceSell ; // ???? ???????? ?????? ?? ??? ??????????? ??????
double PriceSellStop; // ???? ???????? ??????????? ?????? STOP
MaxMagNumSell = getMaxShortNum(); // ????? ?????????? ???????????? ?????????? ????? ????????? ?????? ??? ??????
OrderPriceSell = getOrderPriceByNum( MaxMagNumSell ); // ????????? ???? ???????? ?????? ?? ??? ??????????? ??????
PriceSellStop = OrderPriceSell - Step*Point - (Point * MarketInfo(Symbol(),MODE_SPREAD) ); // ???? ???????? ??????????? ?????? STOP
if (isMagNum(2,201) == False) { //--- ???? ??? ?? ??????? ?????
Tiket = OrdeПоказано первые 50% кода (символов: 19311)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.