Além dos parâmetros obrigatórios e comuns para todas as estratégias, descritos na seção “Estratégias Disponíveis”, a SpreadMaker poderá ter ou não, de acordo com a sua obrigatoriedade, os seguintes parâmetros:
Nome do campo | obrigatório | Tipo | Observação |
Method | Y | string | Aceita valores: 0 - Diferença Ponderada, 1 - Razão, 3 - Diferença |
SpreadTol | Y | float | Coeficiente spread alvo, calculado a partir do preço das pernas: Compra – Venda (Diferença), Compra / Venda (Razão) |
SellOrderMaxProclaimedQty | Y | int | Quantidade apregoada venda |
SellOrderMinProclaimedQty | Y | int | Quantidade mínima para venda |
NumSecsToSolveMismatchedLeg | N | int | Tempo em segundos para a resolução automática de despernamento |
BVSPAccount | Y | string | Conta Bovespa do usuário |
TolStop | N | float | Define um coeficiente de parada. Se o coeficiente do mercado alcançar um valor igual ou pior que este valor, o robô automaticamente substiruirá o ‘Coeficiente Selecionado’ pelo valor configurado no campo ‘TolLoss’ |
TolLoss | Condicionado ao TolStop | float | Novo coeficiente atribuído se a condição do TolStop for cumprida |
StrategyLegs | Y | object | Duas, 1 perna de compra e outra de venda |
EndDate | N | date | Define a data final até quando a ordem deverá ficar ativa |
Propriedades das StrategyLegs | |||
Symbol | Y | string | Papel negociado |
Side | Y | string | Compra ou venda |
OrderQty | Y | int | Quantidade negociada |
IsFinancialQty | N | boolean | Especifica se a quantidade é financeira ou não, valor defaul = false |
BookDepth | N | int | Profundidade máxima a apregoar no book (apregoado por preços). Aceita valores: -1 : Pedra/espera, Só lançará a perna em questão quando a confirmação da execução das outras pernas for recebida. 0 : Pedra, Desliga a apregoação naquela perna. 1 : Apregoa até a profundidade 1 do book |
IgnoreQty | Y | int | Quantidade a ser ignorada no book no momento de pegar o preço que está na pedra, no caso de uma apregoação. |
Para exemplificar o envio de uma SpreadMaker com o método Diferença, foi criado um form para capturar os parâmetros de criação de ordem.
<div class="main-content"> <div class="container-fluid"> <div class="row"> <div class="col-md-6"> <div class="card "> <div class="card-header "> <h4 class="card-title">Spread Maker Order</h4> </div> <div class="card-body "> <form [formGroup]="formstrategia" (ngSubmit)="CriarEstrategia()" class="form-horizontal"> <div class="form-group"> <input type="text" readonly class="form-control" formControlName="TargetStrategy" id="TargetStrategy" placeholder="Tipo Estrátegia"> </div> <div class="form-check-radio"> <label class="form-check-label"> <input class="form-check-input" type="radio" value="1" formControlName="Method">Razão <span class="form-check-sign"></span> </label> </div> <div class="form-check-radio"> <label class="form-check-label"> <input class="form-check-input" type="radio" value="3" formControlName="Method">Diferença <span class="form-check-sign"></span> </label> </div> <div class="form-check-radio"> <label class="form-check-label"> <input class="form-check-input" type="radio" value="0" formControlName="Method">Diferença Ponderada <span class="form-check-sign"></span> </label> </div> <label for="Target">Target </label> <div class="form-group"> <input type="text" class="form-control" formControlName="Target" id="Target" placeholder="1.11 "> </div> <div class="row"> <div class="col-sm-12"> <div class="row"> <div class="col-md-6"> <label>SellOrderMaxProclaimedQty</label> <div class="form-group"> <input type="text" class="form-control" formControlName="SellOrderMaxProclaimedQty" id="SellOrderMaxProclaimedQty" placeholder="ex: 500"> </div> </div> <div class="col-md-6"> <label for="autoSizingInput">SellOrderMinProclaimedQty</label> <div class="form-group"> <input type="text" class="form-control" formControlName="SellOrderMinProclaimedQty" id="SellOrderMinProclaimedQty" placeholder="ex: 200"> </div> </div> </div> </div> </div> <label for="autoSizingInput">NumSecsToSolveMismatchedLeg </label> <div class="form-group"> <input type="text" class="form-control" formControlName="NumSecsToSolveMismatchedLeg" id="NumSecsToSolveMismatchedLeg" placeholder="ex: 6 "> </div> <div class="form-check"> <label class="form-check-label"> <input class="form-check-input" type="checkbox" formControlName="IgnoreTradesOutOfPriceLimit"> <span class="form-check-sign"></span> Ignore Trades Out Of PriceLimit </label> </div> <div class="form-check mt-3"> <div class="form-check"> <label class="form-check-label"> <input class="form-check-input" type="checkbox" formControlName="ConsiderCrossTrades"> Consider Cross Trades <span class="form-check-sign"></span> </label> </div> </div> <label for="autoSizingInput">BVSPAccount</label> <div class="form-group"> <input type="text" class="form-control" formControlName="BVSPAccount" id="BVSPAccount" placeholder="ex: 502 "> </div> <label for="autoSizingInput">BMFAccount</label> <div class="form-group"> <input type="text" class="form-control" formControlName="BMFAccount" id="BMFAccount" placeholder="ex: 502"> </div> <label for="autoSizingInput"> Account Number</label> <div class="form-group"> <input type="text" class="form-control" formControlName="AccountNumber" id="AccountNumber" placeholder="ex: 501 "> </div> <label for="autoSizingInput"> TolStop</label> <div class="form-group"> <input type="text" class="form-control" formControlName="TolStop" id="TolStop" placeholder="ex: 2.98 "> </div> <label for="autoSizingInput"> TolLoss</label> <div class="form-group"> <input type="text" class="form-control" formControlName="TolLoss" id="TolLoss" placeholder="ex: 2.97 "> </div> <label for="autoSizingInput"> StartTime</label> <div class="form-group"> <input type="text" class="form-control" formControlName="StartTime" id="StartTime" placeholder="ex: 2023-01-17T10:00:00 "> </div> <label for="autoSizingInput"> EndTime</label> <div class="form-group"> <input type="text" class="form-control" formControlName="EndTime" id="EndTime" placeholder="ex: 2023-01-17T21:00:00 "> </div> <div class="card-header "> <h4 class="card-title">Strategy Legs</h4> </div> <div class="card-body "> <div *ngFor="let leg of legFormGroups; let i = index" > <h5><label for="'Leg' + i"><b>Leg <span *ngIf="i==0">Venda</span> <span *ngIf="i==1">Compra</span></b></label></h5> <div class="col" [formGroup]="leg" class="row"> <label for="'Symbol' + i"><b>Symbol</b></label> <div class="form-group"> <input type="text" class="form-control" formControlName="Symbol" id="'Symbol' + i" placeholder=" "> </div> <label for="'Side' + i">Side</label> <div class="form-group"> <input type="text" class="form-control" formControlName="Side" id="Side' + i" placeholder=" "> </div> <label for="'OrderQty' + i">Order Qty</label> <div class="form-group"> <input type="text" class="form-control" formControlName="OrderQty" id="'OrderQty' + i" placeholder=" "> </div> <label for="'IsFinancialQty' + i">IsFinancial Qty</label> <div class="form-group"> <input type="text" class="form-control" formControlName="IsFinancialQty" id="'IsFinancialQty' + i" placeholder=" "> </div> <label for="'BookDepth' + i"><b>BookDepth</b> </label> <div class="form-group"> <input type="text" class="form-control" formControlName="BookDepth" id="'BookDepth' + i" placeholder=" "> </div> <label for="'IgnoreQty' + i">IgnoreQty</label> <div class="form-group"> <input type="text" class="form-control" formControlName="IgnoreQty" id="'IgnoreQty' + i" placeholder=" "> </div> <h5><label for="'Leg' + %i"><b> </b></label></h5> </div> </div> </div> <div class="card-footer "> <button type="submit" class="btn btn-info btn-round">Submit</button> </div> </form> </div> </div> </div> </div> </div> </div>
No nosso exemplo estamos colocando a chamada no spreadmaker.components.ts
fstrategia: FormGroup; // incluir form no construtor constructor( private authService: AuthService, private fb: FormBuilder, ) { this.fstrategia = fb.group({ TargetStrategy: new FormControl(1002), Method: new FormControl(''), Target: [''], SellOrderMaxProclaimedQty: new FormControl(''), SellOrderMinProclaimedQty: new FormControl(''), NumSecsToSolveMismatchedLeg: new FormControl(''), IgnoreTradesOutOfPriceLimit: new FormControl(false), ConsiderCrossTrades: new FormControl(false), BVSPAccount: new FormControl(''), BMFAccount: new FormControl(''), AccountNumber: new FormControl(''), TolStop: new FormControl(0.98), TolLoss: new FormControl(0.97), StartTime: new FormControl(''), EndTime: [''], StrategyLegs: new FormArray([]) }); . . . . CriarEstrategia(){ let requestLocalId = Guid.create().toString(); let serializedForm = JSON.stringify(this.fstrategia.value); this.connection.send("SetStrategyParams", requestLocalId,serializedForm); }
A estratégia criada pelo método “CriarEstrategia()
" será recebida instantaneamente pelo métodos de recebimento de estratégia do WebBroker e enviada para o robô da PnT.
O Json correspondente enviado para o WebBroker:
{ "TargetStrategy": 1002, "AccountNumber": 501, "StartTime": "2023-02-23T10:00:00", "EndTime": "2023-02-23T18:00:00", "Method": 3, "SpreadTol": 1.11, "StrategyLegs": [ { "Symbol": "PETR4", "Side": "V", "OrderQty": "1100", "IsFinancialQty": false, "BookDepth": 1, "IgnoreQty": 300 }, { "Symbol": "PETR3", "Side": "C", "OrderQty": "1200", "IsFinancialQty": false, "BookDepth": 1, "IgnoreQty": 200 } ], "SellOrderMaxProclaimedQty": 500, "SellOrderMinProclaimedQty": 200, "NumSecsToSolveMismatchedLeg": 6, "BVSPAccount": 501, "TolStop": 1.98, "TolLoss": 1.97 }