Author: Neverwolf
Orders Execution
It automatically opens orders when conditions are reached
0 Views
0 Downloads
0 Favorites
OpenTrade
//+------------------------------------------------------------------+
//|                                                   Open Trade.mq5 |
//|                                                   Copyright 2023 |
//|                          https://www.mql5.com/en/users/neverwolf |
//+------------------------------------------------------------------+

#property copyright "Neverwolf"
#property link "https://www.mql5.com/en/users/neverwolf"
#property version "1.00"
#property script_show_inputs

enum TradeType
{
    OPEN_BUY = 0,  // ORDER_TYPE_BUY
    OPEN_SELL = 1, // ORDER_TYPE_SELL
};

input group "Open Trade";
input TradeType OrderType = OPEN_BUY; // Order Type
input double Lots = 0.01;             // Lots
input int dev = 10;                   // Deviation
input double TakeProfit = 0.0;        // TakeProfit in Points
input double StopLoss = 0.0;          // StopLoss in Points
input string commt = "";              // Trade Comment
input int magic = 1212;               // Trade Magic Number

void OnStart()
{
    OpenTrade(Symbol(), (ENUM_ORDER_TYPE)OrderType, Lots, dev, TakeProfit, StopLoss, commt, magic);
}

//+------------------------------------------------------------------+
//| Order Send                                                       |
//+------------------------------------------------------------------+
void OpenTrade(string symbol, ENUM_ORDER_TYPE orderType, double volume, int deviation, double stopLossPoints, double takeProfitPoints, string comment, ulong magicNumber)
{
    double getpoints = SymbolInfoDouble(symbol, SYMBOL_POINT);
    double getask = SymbolInfoDouble(symbol, SYMBOL_ASK);
    double getbid = SymbolInfoDouble(symbol, SYMBOL_BID);
    double minLevel = GetMinTradeLevel(symbol);
    double tp = 0.0, sl = 0.0, price = 0.0;

    // Determine if it's a Buy or Sell trade
    if (orderType == ORDER_TYPE_BUY)
    {
        price = getask;
        tp = (takeProfitPoints != 0.0) ? (getask + takeProfitPoints * getpoints) + (minLevel * getpoints) : 0.0;
        sl = (stopLossPoints != 0.0) ? (getask - stopLossPoints * getpoints) - (minLevel * getpoints) : 0.0;
    }
    if (orderType == ORDER_TYPE_SELL)
    {
        price = getbid;
        tp = (takeProfitPoints != 0.0) ? (getbid - takeProfitPoints * getpoints) - (minLevel * getpoints) : 0.0;
        sl = (stopLossPoints != 0.0) ? (getbid + stopLossPoints * getpoints) + (minLevel * getpoints) : 0.0;
    }
    //--- prepare a request
    MqlTradeRequest request = {};
    ZeroMemory(request);
    request.action = TRADE_ACTION_DEAL;                    // Operation Type
    request.symbol = symbol;                               // Symbol
    request.volume = volume;                               // Volume
    request.type = orderType;                              // Type of Order
    request.deviation = deviation;                         // Deviation
    request.comment = comment;                             // Comment
    request.magic = magicNumber;                           // Magic Number
    request.type_filling = SetTypeFillingBySymbol(symbol); // Filling Type
    request.price = price;
    request.tp = tp;
    request.sl = sl;
    MqlTradeResult result = {};
    ZeroMemory(result);
    // bool ok = OrderSend(request, result);
    bool ok = OrderSend(request, result);
    Print("Function > ", __FUNCTION__);
}
//---
//---
//---
//--- SetTypeFillingBySymbol
ENUM_ORDER_TYPE_FILLING SetTypeFillingBySymbol(const string symbol)
{
    // Get possible filling policy types by symbol
    uint filling = (uint)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);

    if ((filling & SYMBOL_FILLING_FOK) == SYMBOL_FILLING_FOK)
    {
        return ORDER_FILLING_FOK;
    }
    else if ((filling & SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC)
    {
        return ORDER_FILLING_IOC;
    }
    else
    {
        return ORDER_FILLING_RETURN;
    }
}
//---
//---
//---
//--- GetMinTradeLevel
double GetMinTradeLevel(string symbol)
{
    double minLevel = -1.0;
    double freezeLevel = -1.0;
    double stopsLevel = -1.0;

    freezeLevel = (double)SymbolInfoInteger(symbol, SYMBOL_TRADE_FREEZE_LEVEL);
    stopsLevel = (double)SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL);
    minLevel = MathMax(freezeLevel, stopsLevel);

    if (freezeLevel == -1 || stopsLevel == -1 || minLevel == -1)
    {
        Print("Freeze level or Stops level not available for the symbol (-1) ");
        return 0;
    }

    if (minLevel <= 100.0 && minLevel >= 0.0)
        minLevel += 1.0;
    else if (minLevel >= 100.0)
        minLevel = 100.0;

    return minLevel;
}
//---
//---

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---