Versión de video:
Probablemente sepa que tiene que pagar impuestos sobre cualquier ingreso, incl. por ingresos por negociación de valores y derivados (es decir, por negociación en bolsa). Es muy conveniente que el corredor haga los cálculos por usted, antes de que retire dinero de la cuenta, actuando como agente fiscal.
- Interactive Brokers (, ), . , , ; ( 30.04) , , .
, . , . , (. ludo — + .-. μανία — , ), , . , FINRA .. Pattern day trader rule, $25K .
, 50 . , ( " -: "). , , .
, -, , . , xml, , , . , , :
...< ="13"> < ="840" ="BFT WS" ="840" ="32" ="09.12.2020" ="73.6618" ="219.81" ="16191.70" ="893"/>...
</> < ="01" ="0.00" ="41.15" ="41.15" ="0"/>
< ="06" ="500.15" ="42.52" ="42.52" ="0"/> </3></></>
- " /" , . , , , ; - , . , , , .
, - xml , - , . , , ( ). IB csv :
xml , , - :
import com.typesafe.scalalogging.Logger
import org.slf4j.LoggerFactory
import java.io.PrintWriter
import java.nio.charset.Charset
import java.text.DecimalFormatSymbols
import java.util.Locale
import scala.io.Source
object Tax {
def main(args: Array[String]): Unit = {
implicit val logger = Logger(LoggerFactory.getLogger(this.getClass))
import java.text.DecimalFormat
val df = new DecimalFormat("0.00")
val dfRate = new DecimalFormat("0.0000")
df.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ENGLISH))
dfRate.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ENGLISH))
val str = (Source.fromFile("d:\\tax\\1.csv","UTF-8").getLines().toSeq ++ Source.fromFile("d:\\tax\\2.csv","UTF-8").getLines().toSeq)
.map(_.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1).toList)
val rates = Source.fromFile("d:\\tax\\r.csv","windows-1252").getLines().map(_.split(';')).toSeq
.map(e1=>e1.updated(1,e1(1).split('.').reverse.mkString("-")))
def rate(d:String)={
rates.sortBy(_(1)).findLast(e=>e(1)<=d).map{x=>
if (x(1)!=d) logger.debug(s" $d, ${x(1)}")
BigDecimal(x(2).replaceAll(",","."))
}.get
}
val str1 = str.filter(_.length > 15).filter(e => e(0) == "" && e(1) == "Data").filter{e=> e(13)!=""}
.map(e=>(e,{
val date = e(6).replaceAll("\"","" ).split(',')(0)
val rt = rate(date)
val sumR = (rt * BigDecimal(e(13)))
val codes = e(3).trim match {
case " (CFD)" => ("893","06")//1532
case " " => ("893","06")//1532
case "" => ("893","06")//1532
case "" => ("79","01")//1530
}
val xml = s"""< ="840" ="${e(5)}" ="840" ="32" ="${
date.split('-').reverse.mkString(".")
}" ="${dfRate.format(rt)}" ="${df.format(BigDecimal(e(13)))}" ="${df.format(sumR)}" ="${codes._1}"/>"""
(xml,sumR,codes)
}))
val txt = str1.filter(_._2._2>0).map(_._2._1).mkString("") +
str1.groupBy(_._2._3).map(e=>(e._1,{
val x = e._2.map(_._2._2)
(x.filter(_ >0).sum,-x.filter(_ <0).sum)
})).map(e=>
s"""< ="${e._1._2}" ="${df.format(e._2._1)}" ="${df.format(e._2._2)}" ="${df.format(e._2._2)}" ="0"/>"""
).mkString("\n") match {
case e=> new PrintWriter("d:\\tax\\tax_xml.txt", Charset.forName("UTF-8")) { write(e); close }
}
logger.debug(s"=${str1.map(e=>e._2._2).filter(_ >0 ).sum} " +
s"=${str1.map(e=>e._2._2).filter(_ <0 ).sum}" +
s"=${str1.map(e=>e._2._2).sum}")
}
}
:
, CFD , , .
"2020-12-24" ( . ), .
split(','), regexp.
, (design pattern, all rights reserved) , ? -, , . , , .
Y en segundo lugar, todos alguna vez soñamos que lanzaríamos cohetes a Marte, o escribiríamos juegos de la categoría triple-A, pero en realidad las tareas de producción son una cosa mucho más aburrida, esto es principalmente contabilidad, 1C, SAP, o con estuche. bancos, java / scala, hojas de cálculo Excel, consultas SQL, generación xml y json. Cuanto antes el programador novato disipe las ilusiones dañinas, mejor.
Por lo tanto, creo que, incluso si no comercia con corredores extranjeros y no necesita tomar 3-NDFL, esta nota también puede ser interesante para usted.